動態規劃入門:求最小硬幣個數

問題描述:
給出已有的硬幣面額,和需用這些硬幣組成的目標金錢數目,求能夠組成這個目標金錢的最少硬幣個數。
問題分析:
給定面額爲c=[c1,c2,…ck],給定金錢數目爲s,s可以由c中任意可行面額組成,則k可以分成:
s - ci + ci ,其中i<=k,且ci<=s,這樣問題就轉化爲組成 金額爲s-ci的最少硬幣個數,假設爲m,則組成s的最少硬幣個數爲m+1,同理可以繼續求解s-ci。於是,我們可以定義d[n]表示組成n的最少硬幣個數,那麼
d[n]=min([ d[s-ci]+1,其中i<=k,且ci<=s ] ),我們可以由1到n依次記錄d[x],即自底向上,當我們再次用到d[x]就不必再次計算。
python代碼:

def leastCoins(c,s):
    #初始化d數組,d[0]=0,其餘爲inf(無限大),共有s+1個元素
    d=[float('inf') if i != 0 else 0 for i in range(s+1)]
    #依次求出d[1],d[2],...,d[s]
    for i in range(1,s+1):
        #當c中元素均大於i時,說明i無法由c中任何元素構成,設置爲inf
        d[i]=min([d[i-cc]+1 if cc<=i else float('inf') for cc in c])
    return d[s]

當d[s]返回inf時,說明c中的元素無法組通過想加到達s

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章