硬币找零问题疑问

AI吧Python

对于这个硬币找零问题,以下代码可以顺利运行,没有任何问题:

def coinChange(coins, amount):
        dicts={}
        def func(amount):            
            if amount in dicts:
                return dicts[amount]
            if amount==0:
                return 0        
            mini=float("inf")
            for i in coins:     
                if amount-i>=0:
                    mini=min(mini,1+func(amount-i))
                    
            dicts[amount]=mini
            return mini
        mini=func(amount)
        if mini>amount:
            return -1
        return mini

我尝试过:

但是如果我更改 mini=amount+10 而不是 float(‘inf’),那么对于输入:coins=[281,20,251,251] ,amount=7323,我得到 39 而不是 66。为什么?

我的意思是,因为在每个递归深度中,假设剩余的数量是 7,那么您将需要的最大硬币也是 7(所有“1”硬币),所以它不会比这更大。但是为什么它对 (mini=amount+10) 给出了错误的答案,但如果它设置为无穷大却给出了正确的答案?

解决方案 1

float(inf)用于设置具有无限大值的变量。
结果,当您mini与任何func可以返回的值进行比较时,它总是最初会返回另一个值,因为它必须是有限的,因此小于无限大的值!

使用调试器准确查看您的代码在做什么,您就会明白我的意思。

解决方案 2

引用:但是如果我更改 mini=amount+10 而不是 float(‘inf’),那么对于输入:coins=[281,20,251,251],amount=7323,我得到 39 而不是 66。为什么?
您的代码不符合您的预期,或者您不明白为什么!

有一个几乎通用的解决方案:逐步在调试器上运行代码,检查变量。
调试器在这里向您展示您的代码在做什么,您的任务是与它应该做什么进行比较。
调试器没有魔法,它不知道你的代码应该做什么,它不会发现错误,它只是通过向你展示正在发生的事情来帮助你。当代码没有达到预期的效果时,您就接近了一个错误。
要查看您的代码在做什么:只需设置一个断点并查看您的代码执行情况,调试器允许您逐行执行并在执行时检查变量。

发表评论

邮箱地址不会被公开。 必填项已用*标注