如果我有两个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
你能帮我找到一种递归方法吗?或者至少了解如何做到这一点?
答案 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)
调用以查找是否存在最佳解决方案。
现在,想一想:
f(SUM/2,n) =
false
注意:强>
|SUM|/2