使用动态规划解决背包问题

时间:2014-03-15 11:58:02

标签: python algorithm

我正在使用我在此链接Knapsack Problem

中找到的算法实现背包问题的片段

我也在这里附上了算法的片段。 Knapsack Algorithm

我为该算法编写了以下python代码段。这是:

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

    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] <= wx:

                V[i][wx] = max(V[i-1][wx], v[i]+V[i-1][wx-w[i]])
            else:
                V[i][wx] = V[i-1][wx]
    return V[n][W]

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

我应该在 [4,9] 位置输出 90 。我在这里做错了什么?

1 个答案:

答案 0 :(得分:2)

我不确定,但我认为错误是

  • 元素v and w是从0开始的索引(0到n-1)
  • 您正在1 to n
  • 范围内进行迭代
  • 因此w[n]v[n]会抛出IndexError

更新了代码:

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

    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]])
            else:
                V[i][wx] = V[i-1][wx]
    return V[n][W]

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

输出现在为90

Output of the above code

检查Ideone

处的结果