1.遞迴(recursion)
def
coins_changerec
(coin_values, change):
""" 遞迴實現零錢找零
"""min_count = change
# base case
if change in coin_values:
return
1for value in [i for i in coin_values if i <= change]:
count = 1 + coins_changerec(coin_values, change-value)
if count < min_count:
min_count = count
return min_count
2.新增caching的遞迴
def
coins_changerec_cache
(coin_values, change, known_counts=none):
""" 新增了caching的遞迴零錢找零,
用空間換時間
"""if known_counts == none:
known_counts = [0] * (change + 1) # why plus 1? think!
min_count = change
# base case
if change in coin_values:
return
1elif known_counts[change] > 0:
return known_counts[change]
for value in [i for i in coin_values if i <= change]:
count = 1 + coins_changerec_cache(coin_values,
change-value,
known_counts)
if count < min_count:
min_count = count
known_counts[change] = min_count
return min_count
3.動態規劃(dynamic programming)
def
coins_changedp
(coin_values, change, min_counts=none, last_used_coins=none):
""" 利用動態規劃(dynamic programming)的思想實現零錢找零
"""if min_counts == none:
min_counts = [0] * (change + 1)
if last_used_coins == none:
last_used_coins = [0] * (change + 1)
for cents in range(change + 1):
min_count = cents
for value in [i for i in coin_values if i <= cents]:
if1 + min_counts[cents-value] < min_count:
min_count = 1 + min_counts[cents-value]
last_used_coins[cents] = value
min_counts[cents] = min_count
return min_counts[-1], print_coins(change, last_used_coins)
defprint_coins
(change, last_used_coins):
used_coins =
while change > 0:
change = change - last_used_coins[change]
return
','.join(used_coins)
最後測試三種方法實現的零錢找零的時間效率:
def
main
():import timeit
value_list = [1, 5, 10, 25]
t1 = timeit.timer('coins_changerec(%s,%s)'%(value_list, 63),'from __main__ import coins_changerec, main')
t2 = timeit.timer('coins_changerec_cache(%s,%s)'%(value_list, 63),'from __main__ import coins_changerec_cache, main')
t3 = timeit.timer('coins_changedp(%s,%s)'%(value_list, 63),'from __main__ import coins_changedp, main')
print(t1.timeit(number=1))
print(t2.timeit(number=1))
print(t3.timeit(number=1))
main()
結果顯示:
第一種沒有新增caching的遞迴實現,完成一次63分零錢的找零竟然需要60s,簡直無法忍受。
而新增了caching的遞迴,一次找零0.22ms就完成了,這是生動的用空間換時間的演算法。而採用dp思想的演算法,0.14ms就完成了。
python找零錢程式 Python 找零問題
coding utf 8 def change money money print 總金額 str money 元 loop true tmp 面值列表 單位 元 type 100,50,20,10,5,1,0.5,0.1 sy int money 10 將傳入的金額 10,轉換為 角 單位 whi...
Python遞迴 找零錢
無法解決某些情況,例如存在21元的零錢 def fun n count 0 while n 25 n n 25 count count 1 while n 10 n n 10 count count 1 while n 5 n n 10 count count 1 while n 0 n n 1 c...
找零錢問題
問題描述 我們知道人民幣有1 2 5 10 20 50 100這幾種面值。現在給你n 1 n 250 元,讓你計算換成用上面這些面額表示且總數不超過100張,共有幾種。比如4元,能用4張1元 2張1元和1張2元 2張2元,三種表示方法。輸入有多組,每組一行,為乙個整合n。輸入以0結束。輸出該面額有幾...