《每日一題》動態規劃入門 求最小硬幣個數

2021-08-11 09:11:12 字數 781 閱讀 7908

問題描述:

給出已有的硬幣面額,和需用這些硬幣組成的目標金錢數目,求能夠組成這個目標金錢的最少硬幣個數。

問題分析:

給定面額為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

0for 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

動態規劃入門(一)

什麼是動態規劃?動態規劃是分階段劃分求最優值的的演算法。1將複雜問題按階段劃分成子問題 2列舉問題各種可能情況,從中找出最優值 3利用子問題的最優解球的原問題的最優解。列1小明寫了乙個簡單的吃金幣遊戲,規則如下 在乙個長方形地圖上,玩家每次能從乙個方格走到相鄰乙個方格。玩家控制的角色可以向下或者向右...

每日一題 翻硬幣

翻硬幣 小明正在玩乙個 翻硬幣 的遊戲。桌上放著排成一排的若干硬幣。我們用 表示正面,用o表示反面 是小寫字母,不是零 比如,可能情形是 oo oooo 如果同時翻轉左邊的兩個硬幣,則變為 oooo oooo 現在小明的問題是 如果已知了初始狀態和要達到的目標狀態,每次只能同時翻轉相鄰的兩個硬幣,那...

LeetCode每日一題 接雨水 動態規劃

給定 n 個非負整數表示每個寬度為 1 的柱子的高度圖,計算按此排列的柱子,下雨之後能接多少雨水。如圖 這道題的解法依舊很簡單,我們可以搜尋兩個相同數列,取他的指標相加減,也可以從底部向上依次累加,尋找每一層會存續的水,我們依舊先看暴力解法是否可以完成。在暴力解法之中,我們可以一層一層的搜尋,將每一...