Recursion 调试换币动态规划

Recursion 调试换币动态规划,recursion,dynamic-programming,Recursion,Dynamic Programming,我的硬币兑换动态编程实现在一些测试用例中失败,我很难找出原因: 问题陈述:给定一个数量和一个硬币列表,找出制造该数量所需的最小硬币数量 例如: 目标金额:63 硬币清单:[1,5,10,21,25] 输出:[21,21,21] def coin_change(change_list, amount, tried): if amount <= 0: return [] if amount in change_list: return [amou

我的硬币兑换动态编程实现在一些测试用例中失败,我很难找出原因:

问题陈述:给定一个数量和一个硬币列表,找出制造该数量所需的最小硬币数量

例如:
目标金额:63
硬币清单:[1,5,10,21,25]
输出:[21,21,21]

def coin_change(change_list, amount, tried):
    if amount <= 0:
        return []
    if amount in change_list:
        return [amount]
    if amount in tried:
        return tried[amount]
    coin_count = []
    for change in change_list:
        if change < amount:
            changes = coin_change(change_list, amount-change, tried)
            changes.append(change)
            coin_count.append(changes)
    min_changes = coin_count[0][:]
    for x in coin_count[1:]:
        if len(min_changes) >= len(x):
            min_changes = x[:]
    tried[amount] = min_changes[:]
    return min_changes


def main():
    for amount in range(64):
        changes = coin_change([1, 5, 10, 21, 25], amount, {})
        if sum(changes) != amount:
            print "WRONG: Change for %d is: %r" % (amount, changes)
        else:
            # print "Change for %d is: %r" % (amount, changes)
            pass


if __name__ == "__main__":
    main()
def硬币兑换(兑换清单、金额、已尝试):
如果金额=len(x):
最小变化=x[:]
已尝试[金额]=最小更改数[:]
返回最小值更改
def main():
对于范围(64)内的金额:
零钱=硬币零钱([1,5,10,21,25],金额,{})
如果总和(变化)!=数量:
打印“错误:%d的更改为:%r”%(金额,更改)
其他:
#打印“对%d的更改为:%r%”(金额,更改)
通过
如果名称=“\uuuuu main\uuuuuuuu”:
main()

韦小宝:

您在循环过程中附加变量,从而损坏了变量,
更改了它。试试这个:

替换这两行:

changes.append(change)
coin_count.append(changes)
与:

_changes = changes[:] + [change]
coin_count.append(_changes)