使用动态规划的背包无法给出正确答案

Posted

技术标签:

【中文标题】使用动态规划的背包无法给出正确答案【英文标题】:Knapsack using Dyanmic Programming Fails to give correct answer 【发布时间】:2014-03-15 13:22:22 【问题描述】:

我正在使用我在此链接Knapsack Problem 中找到的算法来实现背包问题的 sn-p

我之前在 Stack Overflow 上问过这个问题,我在从程序的 return 语句中获取输出时遇到问题。你可以在这里查看Previous question

这里我也附上了算法的sn-p。

我已经为算法编写了以下 python sn-p。这里是:

def knapsack(v,w,n,W):
    V = [[None for x in range(W+1)] for x in range(len(v)+1)]
    keep = [[0 for x in range(W+1)] for x in range(len(v)+1)]
    # print keep

    for wy in range(W+1):
        V[0][wy] = 0

    for i in range(1,n+1):
        for wx in range(W+1):
            # print i,wx
            if w[i-1] <= wx:

                V[i][wx] = max(V[i-1][wx], v[i-1]+V[i-1][wx-w[i-1]])
                keep[i][wx] = 1
            else:
                V[i][wx] = V[i-1][wx]
                keep[i][wx] = 0
    K = W
    # print keep
    for i in range(n,0,-1):
        if keep[i][K] == 1:
            print i
            K = K - w[i-1]

    return V[n][W]

print knapsack(v = [10,40,30,50], w=[5,4,6,3],n=4,W=10)

我应该得到 4,2 作为我的价值,但得到 4,3 。请纠正我哪里出错了。

【问题讨论】:

【参考方案1】:

if 语句中的问题:

        if w[i-1] <= wx:

            V[i][wx] = max(V[i-1][wx], v[i-1]+V[i-1][wx-w[i-1]])
            keep[i][wx] = 1
        else:
            V[i][wx] = V[i-1][wx]
            keep[i][wx] = 0

如果(w[i-1] &lt;= wx) and (v[i-1]+V[i-1][wx-w[i-1]] &lt;= V[i-1][wx])你在做

            V[i][wx] = max(V[i-1][wx], v[i-1]+V[i-1][wx-w[i-1]])
            keep[i][wx] = 1

但你应该

            V[i][wx] = V[i-1][wx]
            keep[i][wx] = 0

【讨论】:

以上是关于使用动态规划的背包无法给出正确答案的主要内容,如果未能解决你的问题,请参考以下文章

0-1 整数背包返回错误答案(动态规划)

解决背包动态规划调试

动态规划,0/1背包,完全背包

动态规划算法之0-1背包问题

动态规划算法之0-1背包问题

动态规划算法之0-1背包问题