【问题标题】:Recursive function to test all the possible combinations and find the smaller one递归函数测试所有可能的组合并找到较小的组合
【发布时间】:2012-11-28 15:04:57
【问题描述】:

我正在处理一个问题,试图创建一种递归方法来测试所有可能的组合并告诉我“最便宜”的组合。

任务是:

  • 我有一个 Array[n] 数字,它是动态分配和填充的。 {1, 3, 4, 2} 例如。数组定义为
    int *array;
  • 我喜欢数组的大小并放入变量 Size。
  • 数组中的每 2 个数字表示一个段的顶部和底部,因此在这种情况下,数组有 3 个段。这些段是:A = 1 3 ,B = 3 4 ,C = 4 2 。
  • 我必须按照他们的顺序加入他们。我可以从最后两个开始加入到第一个,也可以从中心到两侧开始,但我必须选择“最便宜”的方式。
  • 每次我加入两个段: A = 1 3 和 B = 3 4 。我这样计算它的成本:(1 * 4) + 3。我将段末端的数字相乘,然后与段之间的数字相加。
  • 输入将始终是 2 个或更多段,表示数组中的 3 个或更多数字。

实际上我需要它做的是:

For two segments: array= "1 2 3"<br> A={1,2},B={2,3} ---- (1*3)+2 -&gt; Cost = 5

For three segments: array= "30 20 25 10"
A={30,20},B={20,25},C={25,10} ----
case1 - [(30*25)+20] + [(30*10)+25] -> Cost = 1095
case2 - [(20*10)+25] + [(30*10)+20] /> Cost = 545

所以我们可以清楚地看到第二个成本更好,所以我们返回那个值。 对于更多段,计算次数会急剧增加,但这对于我的需要来说是可以的。

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

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

【问题讨论】:

  • 您想知道哪个是最便宜的成本还是相关​​的“订单”?它必须高效吗?
  • 不,我只需要知道较低的成本。我不需要知道其他任何事情,这使它更容易。关于效率,不完全是,如果它只是工作,即使是困难的方式,我会很高兴。

标签: arrays recursion combinations allocation segments


【解决方案1】:

A 是我们的n 数字数组,A[j] 第 j 个元素,A[i,k] 是 A 的子数组,其中第 i 个到第 k 个元素,包括。索引从 0 开始计数,因此 A = A[0, n-1]。加入操作的结果是什么?例如A = { 1, 2, 3 } 有两个段1,22,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+j),因为A[i,k]不直接对应一个C结构,但是可以大致翻译成下面这样

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

【讨论】:

  • 我不确定你所说的 A 是什么意思。但我理解的是 A 是数组的第一个数字,我用其余的数字对其进行测试?我不明白这将如何尝试将段 1 与 2 连接,将段 3 与 4 连接,最后将段 12 与 34 连接起来。我可能误解了 A 的含义。
  • 我敢打赌,我不小心把你的Array改成了A
  • 哦,我现在好多了。之前的方式让我很困惑。好吧,我会尝试让你知道。
猜你喜欢
  • 2014-02-28
  • 1970-01-01
  • 1970-01-01
  • 2018-01-11
  • 1970-01-01
  • 2015-08-11
  • 1970-01-01
  • 1970-01-01
  • 2018-04-21
相关资源
最近更新 更多