为什么只需对矩阵进行简单的更改就可以实现0/1背包的这种实现?

时间:2019-03-10 01:06:24

标签: python algorithm dynamic-programming knapsack-problem

我有一个奇怪的问题。我正在尝试在python 3中使用DP实现0/1背包,并且当我将matrix(DP)设置为以下代码中的内容时,它可以工作,但是,如果我将DP更改为已注释掉的内容,则改为得到无限的背包的解决方案。任何人都可以弄清楚为什么会这样吗?我注意到,当我使用注释掉的DP时,包括第0行(仅应由零组成)的所有行都是相同的值。有什么想法吗?

def knapsack(values, weights, capacity):
    n = len(values)
    DP = [[0 for x in range(capacity+1)] for x in range(n+1)]
    #DP = [[0] * (capacity+1)] * (n+1)

    for i in range(1, n+1):
        for j in range(1, capacity+1):
            if weights[i-1] <= j: 
                DP[i][j] = max(values[i-1] + DP[i-1][j-weights[i-1]], DP[i-1][j])
            else:
                DP[i][j] = DP[i-1][j] 
    return DP[n][capacity]


weights = [10, 20, 30]
values = [60, 100, 120]
capacity = 50

print(knapsack(values, weights, capacity))

0/1中的输出为220,注释中的输出为300(这应该是无限制背包的解决方案)。经过其他示例输入的测试,每次都适用。

0 个答案:

没有答案