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])
这称为动态规划
在CA[j]
中,A[i,k]
可以转换为*(A+j)
,其中asA[i,k]
并不直接对应于C构造,但可以大致转换为以下内容
struct Array {
int * A;
int index_first;
int index_last;
};
你想知道哪一个是最便宜的成本还是相关的“订单”?它必须是高效的吗?不,我只需要知道更低的成本。我不需要知道任何其他的事情,这样会更容易。关于效率,不完全是这样,即使很难,我也会很高兴。我不确定你所说的A是什么意思。但我理解的是A是数组的第一个数字,我用其余的数字来测试它?我不知道这将如何尝试将段1与段2、段3与段4连接起来,并最终将段12与段34连接起来。。我可能误解了A的含义。我打赌,我无意中把你的
数组
改成了A
。哦,我现在感觉好多了。前面的路把我弄糊涂了。我会尽量让你知道的。