數據結構學習筆記9(北大公開課)目錄
解決問題的策略
一、知識概覽
本章介紹了找零兌換問題的動態規劃解法。
二、動態規劃代碼實現
#找零兌換問題
##動態規劃解法
def dpMakeChange(coinValueList,change,minCoins):
#從1分開始到change逐個計算最少硬幣數
for cents in range(1,change+1):
#初始化硬幣數最大值
coinCounts=cents
#減去每個硬幣類型,向後查最少硬幣數,同時記錄總的最少數
for j in [c for c in coinValueList if c<=cents]:
if minCoins[cents-j]+1<coinCounts:
coinCounts=minCoins[cents-j]+1
#得到當前最少硬幣數,計入表中
minCoins[cents]=coinCounts
#返回最後一個結果
return minCoins[change]
print(dpMakeChange([1,5,10,21,25],63,[0]*64))
三、動態規劃算法改進
##算法改進
def dpMakeChange2(coinValueList,change,minCoins,coinsUsed):
#從1分開始到change逐個計算最少硬幣數
for cents in range(1,change+1):
#初始化硬幣數最大值
coinCounts=cents
newCoin=1 #初始化新加硬幣
#減去每個硬幣類型,向後查最少硬幣數,同時記錄總的最少數
for j in [c for c in coinValueList if c<=cents]:
if minCoins[cents-j]+1<coinCounts:
coinCounts=minCoins[cents-j]+1
newCoin=j #對應最小數量,所減的硬幣
#得到當前最少硬幣數,計入表中
minCoins[cents]=coinCounts
#記錄本步驟加的一個硬幣
coinsUsed[cents]=newCoin
#返回最後一個結果
return minCoins[change]
def printCoins(coinsUsed,change):
coin=change
while coin>0:
thisCoin=coinsUsed[coin]
print(thisCoin)
coin=coin-thisCoin
amnt=63
clist=[1,5,10,21,25]
coinsUsed=[0]*(amnt+1)
coinCount=[0]*(amnt+1)
print(dpMakeChange2(clist,amnt,coinCount,coinsUsed),'coins')
printCoins(coinsUsed,amnt)
print(coinsUsed)
輸出
3 coins
21
21
21
[0, 1, 1, 1, 1, 5, 1, 1, 1, 1, 10, 1, 1, 1, 1, 5, 1, 1, 1, 1, 10, 21, 1, 1, 1, 25, 1, 1, 1, 1, 5, 10, 1, 1, 1, 10, 1, 1, 1, 1, 5, 10, 21, 1, 1, 10, 21, 1, 1, 1, 25, 1, 10, 1, 1, 5, 10, 1, 1, 1, 10, 1, 10, 21]