python中使用DP的子集和
下面我将为子集问题编写一个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]=
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表示范围内(行)]