【問題描述】
給定一系列的整數金額的硬幣(數量足夠),給定乙個金額n,問有多少種組配方案?
例如,面值為1和面值為2的硬幣,組配金額4,方案如下:
共三種方案。
【求解思路】
將所有硬幣按照面值大小從小到大排列,假設有m種不同面值的硬幣,那麼最終組配方案可以分為m類:
dp[i]
表示面值
i 的組成種類,每一 輪用前 j
種硬幣進行組配,當第 j
輪,也就是用前
j 種硬幣進行組配時,
dp[i]=dp[i]+dp[i-cost[j]] 也就是在之前的i-cost[j]金額的組配方法總數的基礎上,在加上引入硬幣 coin[j]
的方法總數。
遞推關係式:
dp[i]+=dp[i-cost[j]]
num(coin,amount)
dp=new int[amount]
dp[0]=1 //初始化dp[0]=1方便計算
for(int v:coin) //每一輪引入新的硬幣
for(int i=0;i0)
dp[i]+=dp[i-v]
end for
end for
return dp[amount]
對於乙個需要組配的金額,其可以分為以下
n 類,每一類僅僅使用前
i 種硬幣進行組配,將
硬幣按面值從小到大排,每一輪分析價值
j 的組配方案,累加到
dp[j]
。很顯然
dp[j]
的最優求
解方案對應的
dp[j-coin]
一定是最優方案。一輪輪方案疊加起來即為最終解。
動態規劃求解扎氣球得金幣遊戲
給定n個氣球,編號從0至n 1,每個氣球上寫了乙個數字,這些數字存放在陣列nums中。現在你來扎破所有的氣球。當扎破第i個氣球時,可以得到的金幣個數為nums left nums i nums right 這裡的left和right指的是第i個氣球相鄰氣球的編號。當扎破乙個氣球後,原來它左右側的氣球...
動態規劃 什麼是動態規劃?
先來看看 資訊學奧賽一本通第5版 是怎麼說的 動態規劃程式設計是對解最優化問題的一種途徑 一種方法,而不是一種特殊演算法。不像前面所述的那些搜尋或數值計算那樣,具有乙個標準的數學表示式和明確清晰的解題方法。動態規劃程式設計往往是針對一種最優化問題,由於各種問題的性質不同,確定最優解的條件也互不相同,...
mysql動態規劃 動態規劃
動態規劃 能夠動態規劃的問題具有以下特點 可分解成規模更小的子問題 子問題的結果可復用 關鍵是要理解狀態轉移方程的含義就好啦!數字三角形 問題描述 在數字三角形尋找從頂到底的路徑,使得路徑經過的數字之和最大。規定每一步只能往左下或右下走,求出最大路徑和。遞迴解法 include include us...