试图找出经典的背包再现

时间:2012-12-31 16:25:43

标签: java algorithm dynamic-programming knapsack-problem

我正在阅读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

有什么帮助可以找出公式并对其进行编码?

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 

enter image description here

这意味着以下内容:

这意味着,具有总权重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可以在解决方案中,我们选择具有更大价值的案例。