Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 递归函数,用于测试所有可能的组合并找到较小的组合_Arrays_Recursion_Combinations_Allocation_Segments - Fatal编程技术网

Arrays 递归函数,用于测试所有可能的组合并找到较小的组合

Arrays 递归函数,用于测试所有可能的组合并找到较小的组合,arrays,recursion,combinations,allocation,segments,Arrays,Recursion,Combinations,Allocation,Segments,我正在处理一个问题,试图创建一个递归方法,该方法将测试所有可能的组合,并向我展示“最便宜”的组合 任务是: 我有一个数组[n]编号,它是动态分配和填充的。例如{1,3,4,2}。数组定义为 int*数组 我喜欢数组的大小并输入可变大小 数组中的每2个数字表示一个段的顶部和底部,因此在本例中,数组有3个段。分段为:A=13,B=34,C=42 我必须按顺序加入他们。我可以从最后两个到第一个,也可以从中间到两边,但我必须选择“最便宜”的方式 每次我连接两个段:A=13和B=34。我这样计算成本:(

我正在处理一个问题,试图创建一个递归方法,该方法将测试所有可能的组合,并向我展示“最便宜”的组合

任务是:

  • 我有一个数组[n]编号,它是动态分配和填充的。例如{1,3,4,2}。数组定义为
    int*数组
  • 我喜欢数组的大小并输入可变大小
  • 数组中的每2个数字表示一个段的顶部和底部,因此在本例中,数组有3个段。分段为:A=13,B=34,C=42
  • 我必须按顺序加入他们。我可以从最后两个到第一个,也可以从中间到两边,但我必须选择“最便宜”的方式
  • 每次我连接两个段:A=13和B=34。我这样计算成本:(1*4)+3。我将线段末端的数字相乘,并与线段之间的数字相加
  • 输入将始终为2个或更多段,表示数组中有3个或更多数字
实际上,我需要它做的是:

两段:array=“1 2 3”
A={1,2},B={2,3}--(1*3)+2->Cost=5

对于三个段:array=“30 20 25 10”
A={30,20},B={20,25},C={25,10}--
case1-[(30*25)+20]+[(30*10)+25]->Cost=1095
案例2-[(20*10)+25]+[(30*10)+20]/>成本=545

因此,我们可以清楚地看到,第二个成本更好,因此我们返回该值。 对于更多的部分,计算的数量将急剧增加,但这是我所需要的

我已经用不同的方法尝试了很多次,但是我对所有的指针都感到困惑,而且我不擅长递归函数。 我不知道我是否足够具体,如果有不清楚的地方,我很乐意解释


我当然不需要整个代码,也许会有一些解释或关于如何做的想法:)

A
成为我们的
n
数字数组,
A[j]
第j个元素和
A[I,k]
第I到第k个元素的子数组,包括。索引从0开始计数,因此
A=A[0,n-1]
。联接操作的结果是什么?例如
A={1,2,3}
有两段
1,2
2,3
我正确地假设连接在一起的是
1,3

由于每个连接两部分A分为两部分,您可以通过测试
A
的所有可能连接(即
n-2
可能性)递归,选择成本最低的连接。也许这个方程式给了你一个想法

/* cost of join two segments of A ending respective starting at j */
cost(A,j) = ( A[j-1]*A[j+1] ) + A[j]

 /* minmal cost of joining(A) when joining at j */
mincost(A,j) = mincost( A[0,j-1] ) + cost(A,j) + mincost( A[j+1,n-1] )

/* test all possible join, use minimal one */
mincost(A) = min[j]: mincost(A,j)
n=3时结束递归,使用
cost(A,1)

对于一个可用的算法,您可能需要缓存
mincost(a[x,y])
这称为动态规划

在C
A[j]
中,A[i,k]
可以转换为
*(A+j)
,其中as
A[i,k]
并不直接对应于C构造,但可以大致转换为以下内容

 struct Array { 
          int * A; 
          int index_first;
          int index_last;
 };

你想知道哪一个是最便宜的成本还是相关的“订单”?它必须是高效的吗?不,我只需要知道更低的成本。我不需要知道任何其他的事情,这样会更容易。关于效率,不完全是这样,即使很难,我也会很高兴。我不确定你所说的A是什么意思。但我理解的是A是数组的第一个数字,我用其余的数字来测试它?我不知道这将如何尝试将段1与段2、段3与段4连接起来,并最终将段12与段34连接起来。。我可能误解了A的含义。我打赌,我无意中把你的
数组
改成了
A
。哦,我现在感觉好多了。前面的路把我弄糊涂了。我会尽量让你知道的。