在我检查的所有0/1背包和无界背包的DP解决方案中,解决方法总是像这样定义:
0/1 背包:通过选择第n个物品或排除第n个物品来最大化总价值。例如,0/1背包
无界背包:通过将第n个物品视为最后选择的物品,或者(n-1)个物品作为最后选择的物品等等来最大化总价值。例如,无界背包
但是,无界背包也可以使用0/1背包的逻辑进行求解,只需要进行微小的修改。我的意思是,对于0/1背包,我们可以执行以下操作(使用第一个链接中的代码):
return max( val[n-1] + knapSack(W-wt[n-1], wt, val, n-1),
knapSack(W, wt, val, n-1)
);
请注意,在包含
wt[n-1]
的情况下,我们会将数组的大小减小1。这意味着 wt[n-1]
现在已经用尽,因此不能再次使用。但是,在无界情况下,如果我们不将数组大小减小1(这意味着 wt[n-1]
可以再次使用),则以下略微修改的递归关系仍然有效:return max( val[n-1] + knapSack(W-wt[n-1], wt, val, n),
knapSack(W, wt, val, n-1)
);
为什么关于无界背包的这种方法从未在任何地方提到过?实际上这里明确表示,我们不能像0/1背包那样使用相同的逻辑来解决无界背包问题。以下是来自该链接的摘录:
Observation:
I can never exhaust any item because there are an unbounded supply of items.
Therefore:
The technique used in the 0,1 knapsack problem cannot be used.
但我无法证明我上述的解决方案不起作用。这个想法来自coin-change问题,其中你必须计算为给定金额找零的方法数,假设硬币的供应是无限的。
所以我的问题是,为什么我在这里提出的方法,从未用于无界背包或至少从未在任何地方提到过?有人可以帮我证明或证明这种方法吗?先谢谢了!