可以使用O(n)空间打印解决方案的01Knapsack算法吗?

时间:2015-07-08 08:04:55

标签: algorithm dynamic-programming knapsack-problem

使用动态编程,01 knapsack可以使用以下公式解决:

带有V反向枚举的

f(v) = max(f(v), f(v-cost(i)+w(i))

但如果我想记录哪个项目放入背包,我需要一个二维数组来记录项目索引。

我不确定01Knapsack可以使用O(n)空间来获取放入背包的物品的解决方案吗?

2 个答案:

答案 0 :(得分:1)

对于具有N个状态的DP的解决方案总是可以使用至多O(N)额外存储器来重建。这样做的方法是创建一个与states数组大小相同的附加数组,并存储您为状态执行的每个移动操作。对于此特定问题,您必须记录f(v)f(v-cost(i)+w(i))是否最佳。

答案 1 :(得分:1)

实际上公式是

f(w) = max(f(w), f(w - w[i]) + v[i])

这意味着对于重量w,我们应该尝试采用第i个元素,因此我们应该为剩余权重w - w[i]获取尽可能多的值(它是f(w - w[i]))并且第i个元素提供值v[i]

您可以添加另一个数组choice并检查是否实际f(w - w[i]) + v[i] > f(w)以及是否更新为choice[w] = i

然后你花费O(W)内存,可以轻松恢复你选择的设置。