我正在练习动态规划,但是在调试代码时遇到了困难。我的想法是在给定一组数字的情况下找出是否存在可能的和。以下是我的代码:
a = [2,3,7,8,10]
sum = 11
b = list(range(1, sum+1))
m = [[False for z in range(len(b))] for i in range(len(a))]
for i, x in enumerate(b):
for j, y in enumerate(a):
if x==y:
m[j][i]=True
elif y<x:
m[j][i] = m[j-1][i]
else:
m[j][i] = m[j-1][i] or m[j-i][y-x]
for i, n in enumerate(m):
print(a[i], n)
以下是输出结果:
2 [False, True, False, False, False, False, False, False, False, False, False]
3 [False, True, True, False, False, False, False, False, False, False, False]
7 [False, True, True, False, True, True, True, False, False, False, False]
8 [False, True, True, False, True, True, True, True, False, False, False]
10 [False, True, True, False, True, True, True, True, True, True, False]
据我理解,在我的else语句中,算法应该向上移动1行,然后查看x和y的差异,并检查该插槽是否可用。例如,在最明显的情况下,即最后一行的最后一个元素。那将是10(y)-11(x),它应该一直回到上面一行的索引1,我们知道它是True。不完全确定我做错了什么,任何有助于理解这一点的帮助都将不胜感激。