用python實現零錢找零的三種方法

2021-08-09 20:55:13 字數 2887 閱讀 4849

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結束。輸出該面額有幾...