使用动态编程,01 knapsack
可以使用以下公式解决:
f(v) = max(f(v), f(v-cost(i)+w(i))
。
但如果我想记录哪个项目放入背包,我需要一个二维数组来记录项目索引。
我不确定01Knapsack
可以使用O(n)
空间来获取放入背包的物品的解决方案吗?
答案 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)
内存,可以轻松恢复你选择的设置。