Python 为什么代码给了我错误的数量输出?(变革问题)

Python 为什么代码给了我错误的数量输出?(变革问题),python,dynamic-programming,Python,Dynamic Programming,我试图解决换硬币的问题,在这个问题中,我们必须找到累计到一定数量的硬币的最小数量 以下是我提出的解决方案: import sys denomination = [1,6,10] amount = 12 def coin_change(amount,denomination): coins = 0 ans = [0]*(amount+1) temp = sys.maxsize for i in range(len(ans)): for j in r

我试图解决换硬币的问题,在这个问题中,我们必须找到累计到一定数量的硬币的最小数量

以下是我提出的解决方案:

import sys
denomination = [1,6,10]
amount = 12

def coin_change(amount,denomination):
    coins = 0
    ans = [0]*(amount+1)
    temp = sys.maxsize
    for i in range(len(ans)):
        for j in range(len(denomination)):
            if denomination[j] <= i:
                ans[i] = min(temp, ans[i-denomination[j]]) + 1
    return ans

print(coin_change(amount,denomination))
为什么输出中的最后一个数字是3表示数量12?我已经检查了很多次代码,但我仍然不明白为什么会发生这种情况。对于数量6,它给出1,因此对于数量12,它应该给出2,而不是3


我的代码有什么问题?

问题是
min(temp,…)
是一个无用的调用,因为您从不减少
temp
的值。这个表达式总是返回第二个参数。显然,你真的需要比较备选方案并选择最佳方案,所以这是错误的

这就是你得到3分的原因。最后尝试的面额是10(当
j
为2时)。在那次尝试之前,
ans[12]
实际上是2,但是它被3(10+1+1)覆盖了

下面是一个更正:

import sys
denomination = [1,6,10]
amount = 12

def coin_change(amount,denomination):
    ans = [sys.maxsize]*(amount+1)  # initialise with maximum value
    for i in range(len(ans)):
        for j in range(len(denomination)):
            if denomination[j] <= i:
                if denomination[j] == i:
                    ans[i] = 1  # base case
                else:  # see if we can improve what we have
                    ans[i] = min(ans[i], ans[i-denomination[j]] + 1)
    return ans

print(coin_change(amount,denomination))
导入系统 面额=[1,6,10] 金额=12 def硬币兑换(金额、面额): ans=[sys.maxsize]*(金额+1)#使用最大值初始化 对于范围内的i(len(ans)): 对于范围内的j(len(面额)): if面额[j]
import sys
denomination = [1,6,10]
amount = 12

def coin_change(amount,denomination):
    ans = [sys.maxsize]*(amount+1)  # initialise with maximum value
    for i in range(len(ans)):
        for j in range(len(denomination)):
            if denomination[j] <= i:
                if denomination[j] == i:
                    ans[i] = 1  # base case
                else:  # see if we can improve what we have
                    ans[i] = min(ans[i], ans[i-denomination[j]] + 1)
    return ans

print(coin_change(amount,denomination))