小魚要學數據結構與算法(基於python)—Day9動態規劃求解找零兌換問題

解決問題的策略

在這裏插入圖片描述

一、知識概覽

本章介紹了找零兌換問題的動態規劃解法。
動態規劃解法知識概覽

二、動態規劃代碼實現

#找零兌換問題
##動態規劃解法
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]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章