【问题标题】:Subset Sum in python using DP使用 DP 在 python 中的子集求和
【发布时间】:2018-04-12 03:45:22
【问题描述】:

我正在关注link 为子集问题编写 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](我们引用值的前一行)也得到了更新。我真的迷失了这里发生的事情。请提出建议。

请找到此link 以获取打印的报表。

【问题讨论】:

    标签: python python-3.x dynamic-programming backtracking


    【解决方案1】:

    问题出在这一行 db = [[False] * col] * row。 当您使用 * 运算符时,会生成原始列表的副本,该副本引用原始列表。

    考虑以下示例:

    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 for _ in range(row)].

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多