我正在阅读Knapsack Problem
(无界),正如我所理解的DP中的经典之作。
虽然我认为我在阅读时理解了解决方案,但我不清楚如何将其转换为实际代码
例如,在下面的重复“公式”中:
M(j) = MAX {M(j-1), MAX i = 1 to n (M(j - Si) + Vi) } for j >=1
我不确定如何将其转换为代码,因为我不清楚内部MAX
是否应该存在或者应该只是代替:
M(j) = MAX {M(j-1), M(j - Si) + Vi } for j >=1
有什么帮助可以找出公式并对其进行编码?
答案 0 :(得分:7)
你可以这样编码:
for w = 0 to W //W is the maximum capacity
V[0,w] = 0
for i = 1 to n
V[i,0] = 0
for i = 1 to n
for w = 0 to W
if wi <= w // item i can be part of the solution
if bi + V[i-1,w-wi] > V[i-1,w]
V[i,w] = bi + V[i-1,w- wi]
else
V[i,w] = V[i-1,w]
else V[i,w] = V[i-1,w] // wi > w
这意味着以下内容:
这意味着,具有总权重w的Sk的最佳子集是:
1)总重量> 1的Sk-1的最佳子集。 w,或
2)总重量> 1的Sk-1的最佳子集。 w-wk加上项目k
具有总重量&gt;的Sk的最佳子集。 w,或者包含项目k。
第一种情况:wk&gt; w。项目k不能是解决方案的一部分,因为如果是,则总重量将> w,这是不可接受的。
第二种情况:wk&lt; = w。然后项目k可以在解决方案中,我们选择具有更大价值的案例。