找零算法

找零錢的算法

1. 很慢的遞歸解決方案

# 遞歸版本
def recMC(coinValueList, change):
    minCoins = change
    if change in coinValueList:
        return 1
    else:
        for i in [c for c in coinValueList if c < change]:
            numCoins = 1 + recMC(coinValueList, change-i)
            if numCoins < minCoins:
                minCoins = numCoins
    return minCoins


print(recMC([1,5,10,25], 63))

2. 添加了查詢表的找零算法

def recDC(coinValueList, change, knownResults):
    start = time.time()
    minCoins = change
    if change in coinValueList:
        knownResults[change] = 1
        return 1
    elif 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 numCoins < minCoins:
                minCoins = numCoins
                knownResults[change] = minCoins
    end = time.time()
    length = end - start
    print(length)

    return minCoins

3.動態規劃版本的找零算法

# 動態規劃版本找零問題
def dpMakeChange(coinValueList, change, minCoins, coinUsed):
    for cents in range(change+1):
        coinCount = cents
        new_coin = 1
        for j in [c for c in coinValueList if c <= cents]:
            if minCoins[cents-j] + 1 < coinCount:
                coinCount = minCoins[cents-j] + 1
                new_coin = j
        minCoins[cents] = coinCount
        coinUsed[cents] = new_coin
    return minCoins[change]


def printCoins(coinsUsed, change):
    coin = change
    while coin > 0:
        thisCoin = coinsUsed[coin]
        print(thisCoin)
        coin = coin - thisCoin

c1 = [1,5,10,21,25]
coinUsed = [0]*64
coinCount = [0]*64

cnt = dpMakeChange(c1, 63, coinCount, coinUsed)
print(cnt)

printCoins(coinUsed, 63)
printCoins(coinUsed, 52)

output:
3
21
21
21
10
21
21

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • --- layout: post title: "如果有人問你關系型數據庫的原理,叫他看這篇文章(轉)" date...
    藍墜星閱讀 825評論 0 3
  • ORA-00001: 違反唯一約束條件 (.) 錯誤說明:當在唯一索引所對應的列上鍵入重復值時,會觸發此異常。 O...
    我想起個好名字閱讀 5,451評論 0 9
  • 第二段講的是一個從小就被規劃好,繼承家里百年魚店的青年,卻懷揣音樂家的夢想,并且為了實現這個夢想,放棄讀大學,只因...
    桅笑閱讀 165評論 0 0
  • 老師為了讓我們愛上閱讀,老師就在班里面建立了一個圖書角。一兩天的時間,我們班的圖書角就建立起來了,有的同學...
    胭脂_13ae閱讀 402評論 0 0
  • 我理想中的朋友圈是這樣子的:有很多擁有活力的朋友,大家有創意,有情緒,情商高,過的有趣,那種無需金錢堆積起來的趣味...
    Ernestyoung閱讀 245評論 0 0