3 回答

TA貢獻1797條經驗 獲得超6個贊
我很久以前就研究了這個問題,你可以讀一下我的小文章。這是Mathematica的來源。
通過使用生成函數,您可以獲得問題的封閉形式的恒定時間解決方案。格雷厄姆,克努特和帕塔什尼克的混凝土數學就是這本書的書,并且對這個問題進行了相當廣泛的討論?;旧?,您定義了一個多項式,其中第n個系數是以n美元進行更改的方式的數量。
這篇文章的第4-5頁顯示了如何使用Mathematica(或任何其他方便的計算機代數系統)在三行代碼中在幾秒內計算10 ^ 10 ^ 6美元的答案。
(而且這已經很久以前在75Mhz Pentium上只有幾秒鐘......)

TA貢獻1820條經驗 獲得超3個贊
注意:這僅顯示方式的數量。
Scala功能:
def countChange(money: Int, coins: List[Int]): Int = if (money == 0) 1 else if (coins.isEmpty || money < 0) 0 else countChange(money - coins.head, coins) + countChange(money, coins.tail)

TA貢獻1876條經驗 獲得超7個贊
我贊成遞歸解決方案。你有一些面額列表,如果最小的面額可以平均分配任何剩余的貨幣金額,這應該工作正常。
基本上,您從最大面額移動到最小面額。
遞歸,
您有一個當前總數要填充,以及一個最大面額(剩下超過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)
添加回答
舉報