gyo*_*sko 17 python algorithm dynamic-programming
我正在寻找一个很好的解决变更问题的方法,我找到了这个代码(Python):
target = 200
coins = [1,2,5,10,20,50,100,200]
ways = [1]+[0]*target
for coin in coins:
    for i in range(coin,target+1):
        ways[i]+=ways[i-coin]
print(ways[target])
我理解代码的字面意思是没有问题,但我无法理解为什么它有效.有人可以帮忙吗?
fsw*_*fsw 14
要获得所有可能的元素等于'a'或'b'或'c'(我们的硬币)总和为'X'的集合,您可以:
因此,获得X的方式数量是获得Xa和Xb以及Xc的方式数量的总和.
ways[i]+=ways[i-coin]
休息是简单的复发.
额外提示:在开始时你可以用一种方式设置零和(空集)
ways = [1]+[0]*target
Ada*_*icz 10
这是动态编程的经典示例.它使用缓存来避免两次计算3 + 2 = 5之类的陷阱(因为另一种可能的解决方案:2 + 3).递归算法陷入了陷阱.让我们专注于一个简单的例子,其中target = 5和coins = [1,2,3].您发布的代码重要:
而递归版本计数:
递归代码:
coinsOptions = [1, 2, 3]
def numberOfWays(target):
    if (target < 0):
        return 0
    elif(target == 0):
        return 1
    else:
        return sum([numberOfWays(target - coin) for coin in coinsOptions])
print numberOfWays(5)
动态编程:
target = 5
coins = [1,2,3]
ways = [1]+[0]*target
for coin in coins:
    for i in range(coin, target+1):
        ways[i]+=ways[i-coin]
print ways[target]
| 归档时间: | 
 | 
| 查看次数: | 16770 次 | 
| 最近记录: |