引言
遞迴條件
基本結束條件:需要兌換的找零,其面值正好等於某種硬幣的數倍,沒有餘額。
減小問題的規模:對每種硬幣嘗試一次,分別將找零減去1、5、10、25後,求兌換硬幣的最少數量(遞迴呼叫自身)。
**實現一:
def
recmc
(coinvaluelist,change)
: mincoins=change
if change in coinvaluelist:
return
1else
:for i in
[c for c in coinvaluelist if c<=change]
: numcoins=
1+recmc(coinvaluelist,change-i)
if numcoinsmincoins=numcoins
return mincoins
print
(recmc([1
,5,10
,25],
63))import time
print
(time.clock())
print
(recmc([1
,5,10
,25],
63))print
(time.clock())
#測試結果3e-
07682.5235314
該演算法缺陷:效率低下,因為重複計算太多
遞迴解法改進版:
解決重複計算的方法:用乙個表將計算過的中間結果儲存起來,下次計算前查表看是否計算過。
這個演算法的中間結果就是部分找零的最優解,在遞迴呼叫過程中已經得到的最優解被記錄下來。在遞迴呼叫之前,先查表看是否已有部分找零的最優解,若有,則直接返回最優解而不遞迴呼叫;若沒有,才進行遞迴呼叫,直至結束。
改進python**:
def
recdc
(coinvaluelist,change,knownresults)
: mincoins=change
if change in coinvaluelist:
#遞迴基本結束條件
knownresults[change]=1
#記錄最優解
return
1elif knownresults[change]
>0:
return knownresults[change]
#查表成功,直接用最優解
else
:for i in
[c for c in coinvaluelist if c<=change]
: numcoins=
1+recdc(coinvaluelist,change-i,knownresults)
if numcoinsmincoins=numcoins
knownresults[change]
=mincoins #找到最優解,記錄到表中
return mincoins
import time
print
(time.clock())
print
(recdc([1
,5,10
,25],
63,[0
]*64)
)print
(time.clock())
3e-076
0.0009077
測試結果:
計算時間大幅度縮短,結果秒回! 貪心演算法找零問題
找零問題 假設商店老闆需要找零n元錢,錢幣的面額有 100元 50元 20元 5元 1元,如何找零使得所需錢幣的數量最少?greedy algorithm money 100,50,20,5,1 defchange money x change 0,0,0,0,0 for i,m in enumer...
貪心演算法解決找零錢問題
4.1 找零問題 問題描述 設有50 20 10 5 1 0.5 0.1等面額的零錢,顧 客購物花了n元,在支付 n 100 1 100元後,收銀員應如何找 零,才能使找回的錢數最少。輸入 n,表示顧客所花的錢數,最多包含一位小數。輸出 找回的零錢數。樣例輸入 67.5 243 樣例輸出 5 4 a...
javaScript貪心演算法 找零問題
貪心演算法遵循一種近似解決問題的技術,期盼通過每個階段的區域性最優選擇 當前最好的解 從而達到全域性的最優 全域性最優解 最少硬幣找零問題 最少硬幣找零是給出要找零的錢數,以及可以用硬幣的額度數量,找出有多少種找零方法。如 美國面額硬幣有 1,5,10,25 我們給36美分的零錢,看能得怎樣的結果?...