python中使用DP的子集和

python中使用DP的子集和,python,python-3.x,dynamic-programming,backtracking,Python,Python 3.x,Dynamic Programming,Backtracking,下面我将为子集问题编写一个DP解决方案 def subsetSum(input, target): row, col = len(input)+1, target+1 db = [[False] * col] * row for i in range(row): db[i][0] = True for i in range(1, row): for j in range(1, col): db[i][j]=

下面我将为子集问题编写一个DP解决方案

def subsetSum(input, target):
    row, col = len(input)+1, target+1
    db = [[False] * col] * row
    for i in range(row):
        db[i][0] = True

    for i in range(1, row):
        for j in range(1, col):
            db[i][j]=db[i-1][j]
            if db[i][j]==False and j>=input[i-1]:
                db[i][j] = db[i-1][j-input[i-1]]

    return db[i][j]

target = 5
input = [1,3,9,2]
subsetSum(input, target)
有趣的是,在每次迭代“j”之后,db[i-1](我们指的是数值的前一行)也在更新。我真的不知道这里发生了什么。请建议

请在打印的报表中查找此项。

问题在这一行
db=[[False]*col]*行
。 使用
*
运算符时,会制作原始列表的副本,以引用原始列表

考虑以下示例:

l = [[1]*5]*3
print(l) # prints [[1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1]]
l[0][0] = 0
print(l) # prints [[0, 1, 1, 1, 1], [0, 1, 1, 1, 1], [0, 1, 1, 1, 1]]
每个内部列表都引用相同的对象。因此,当第一个列表的第一个元素发生更改时,所有列表都会发生更改

要解决此问题,您可以使用列表:

l = [[1]*5 for _ in range(3)]
print(l) # prints [[1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1]]
l[0][0] = 0
print(l) # prints [[0, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1]]
具体而言,您可以将分配给
db
的任务替换为以下内容:

db=[[False]*col表示范围内(行)]