C找到两个堆栈之间的较小差异

时间:2014-02-21 10:56:18

标签: c algorithm recursion

如果我有两个stacks,我必须放置来自array的元素,并且我必须找到一种递归方式来放置符合规则的元素,以找到之间的较小差异两个堆栈的总和......

像这样:

values[5] ={1,2,3,4,5}

Stack1 = 4,3

Stack2 = 5,2,1

or 

Stack2 = 4,3

Stack1 = 5,2,1
Difference = between 1 and 2  = 1

你能帮我找到一种递归方法吗?或者至少了解如何做到这一点?

1 个答案:

答案 0 :(得分:4)

这基本上是 partition problem ,即NP-Complete
您试图将thew数组拆分为两个子集(在您的情况下为堆栈,无关紧要),使得它们的总和在最佳情况下相等,或尽可能接近它。

没有已知的多项式解决方案,但如果数字是相当小的整数 - 有一个很好的dynamic programming solution来快速解决它。

一种贪婪的方法(将最高元素放在堆栈中,使用较低的和,并重复)是一种近似值,在最坏的情况下比最优解更差|SUM|/2

编辑:动态编程方法基本上是递归的:

base:
f(0,i) = true
f(x,0) = false    (x > 0)
step:
f(x,i) = f(x-arr[i],i-1) OR f(x,i-1)

使用f(SUM/2,n)调用以查找是否存在最佳解决方案。
现在,想一想:

  1. 如果f(SUM/2,n) = false
  2. ,您可以从中找到“最接近”的解决方案
  3. 如何修改此解决方案,以便为您提供所需解决方案的索引,而不仅仅是布尔答案?
  4. 注意:

    • 另一种递归方法是检查所有可能的子集 数组(有2 ^ n个),并选择那个 将差异最小化为|SUM|/2