【发布时间】:2018-07-03 10:10:06
【问题描述】:
我正在做正数的子集和问题。在典型的 DP 解决方案中,我们使用表格 table[n+1][sum+1] 的 2D DP 表,其中 n 是集合中元素的数量,sum 是目标总和。现在我想优化它以仅使用一行,因为所有行都使用前一行的结果。为此,我提出了一个解决方案:
boolean DP[] = new boolean[sum+1];
DP[0] = true;
for(int i = 0; i < arr.length; i++) {
for(int j = arr[i]; j <= sum; j++) {
DP[j] = DP[j] || DP[j-arr[i]];
}
}
return DP[sum];
此代码未通过某些测试用例。但是,如果我将内部循环更改为向后迭代:
for(int j = sum; j >= arr[i]; j--)
然后这段代码通过了所有的测试用例。我无法弄清楚向后迭代所产生的差异。我会很感激解释。
【问题讨论】:
-
您应该尝试使用调试器来简单了解该过程。
标签: algorithm dynamic-programming