遞迴應用 貪心策略解決找零問題的python實現

2021-10-06 13:28:23 字數 1852 閱讀 9768

引言

遞迴條件

基本結束條件:需要兌換的找零,其面值正好等於某種硬幣的數倍,沒有餘額。

減小問題的規模:對每種硬幣嘗試一次,分別將找零減去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美分的零錢,看能得怎樣的結果?...