为什么这个解决方案不适用于硬币更改算法?

时间:2016-05-24 02:51:38

标签: python algorithm coin-change

编写一个程序,给定N个值进行更改以及m个无限可用硬币的类型数量,以及m个硬币列表,打印出可以从硬币更改为STDOUT的不同方式。

我的直觉是,对于每枚硬币,尝试该硬币,然后递归到n - c,其中c是硬币的值,如果我到零则返回1,如果我低于零则返回0。我通过了以前用过的硬币,只在小于或等于前一枚硬币的硬币上递归,以防止重复。我很困惑为什么这种方法不正确,以及我如何纠正它。

这是我的代码:

def calc_change(n, coins):
    cache = {}
    c = max(coins)
    nums = calc_ways(n, coins, cache, c)
    return nums

def calc_ways(n, coins, cache, current_coin):
    if n < 0:
        return 0
    if n == 0:
        return 1
    if n not in cache:
        cache[n] = sum(calc_ways(n - c, coins, cache, c) for c in coins if c <= current_coin)
    return cache[n]

answer = calc_change(n, coins) 
print answer

感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

您要根据要添加到cache的金额为n编制索引。问题是,相同n的组合数量可能会根据您要考虑的硬币集而改变。 (例如n=10coins=[10,5]有两种可能的组合,但n=10coins=[5]只有一种组合。您需要使用缓存来考虑current_coin变量。< / p>

def calc_change(n, coins):
    cache = {}
    c = max(coins)
    nums = calc_ways(n, coins, cache, c)
    return nums

def calc_ways(n, coins, cache, current_coin):
    if n < 0:
        return 0
    if n == 0:
        return 1
    if (n,current_coin) not in cache:
        cache[(n,current_coin)] = sum(calc_ways(n - c, coins, cache, c) for c in coins if c <= current_coin)
    return cache[(n,current_coin)]

answer = calc_change(n, coins) 
print answer