幕布斯6054654
我赞成递归解决方案。你有一些面额列表,如果最小的面额可以平均分配任何剩余的货币金额,这应该工作正常。基本上,您从最大面额移动到最小面额。递归,您有一个当前总数要填充,以及一个最大面额(剩下超过1个)。如果只剩下1个面额,那么只有一种方法可以填补总数。您可以使用当前面额的0到k个副本,使得k * cur面额<=总计。对于0到k,使用修改的总计和新的最大面额调用函数。将结果从0添加到k。这就是你可以用多少种方式从目前的面额中填补总数。返回此号码。这是我所说的问题的python版本,200美分。我得到了1463种方式。此版本打印所有组合和最终计数总数。#!/usr/bin/python# find the number of ways to reach a total with the given number of combinationscents = 200denominations = [25, 10, 5, 1]names = {25: "quarter(s)", 10: "dime(s)", 5 : "nickel(s)", 1 : "pennies"}def count_combs(left, i, comb, add):
if add: comb.append(add)
if left == 0 or (i+1) == len(denominations):
if (i+1) == len(denominations) and left > 0:
if left % denominations[i]:
return 0
comb.append( (left/denominations[i], demoninations[i]) )
i += 1
while i < len(denominations):
comb.append( (0, denominations[i]) )
i += 1
print(" ".join("%d %s" % (n,names[c]) for (n,c) in comb))
return 1
cur = denominations[i]
return sum(count_combs(left-x*cur, i+1, comb[:], (x,cur)) for x in range(0, int(left/cur)+1))count_combs(cents, 0, [], None)