動態規劃可以解決很多情況很複雜的問題,它的一般使用場景是尋找最優解,尋找解的個數等問題
比如,有無限張面值為1,2,5,10的紙幣,用他們組合出一百面值有多少種方法?
這道問題是一道典型的動態規劃的問題
假如 dp[i][j] 代表使用前 i 種紙幣組合出 j 金額。
所以我們想要知道的就是 dp[4][100] 的值
我們可以發現,如果我們只使用一張最大面額的紙幣,那麼這種前提下組成一百面額的方法有
dp[i-1][j-10] 種,使用兩張面額最大的紙幣,方法有dp[i-1][j-2*10] 種。
所以根據上面的我們就很容易得出狀態轉移方程了
其中x代表紙幣的面額,y代表 j / x ;
dp[i][j] = dp[i-1][j-1*x] + dp[i-1][j-2*x]+…+dp[i-1][j-y*x]
在上面我們已經得到了狀態轉移方程,建立了後乙個結果和前乙個結果的關係,現在我們只需要像斐波那契數列一樣給出初始的值就可以得出任意j的值了。
static
int[
] money =
;static
intsolution2
(int
money,
int num)
//組成金額為0的方法只有一種
for(
int i=
1;i) dp[0]
[0]=
1;for(
int i=
1;i1;i++)}
}return dp[l]
[num]
;}
動態規劃1
維基百科 動態規劃是一種在數學和 電腦科學 中使用的,用於求解包含 重疊子問題 的最優化 問題的方法。其基本思想是,將原問題分解為相似的子問題,在求解的過程中通過子問題的解求出原問題的解。動態規劃的思想是多種演算法的基礎,被廣泛應用於電腦科學和工程領域。比較著名的應用例項有 求解 最短路徑 問題,揹...
動態規劃 1
動態規劃是對最優化問題的一種新的演算法設計方法。由於各種問題的性質不同,確定最優解的條件也互不相同,因而動態規劃的沒計法對不同的問題,有各具特色的表示方式。不存在一種萬能的動態規劃演算法。但是可以通過對若干有代表性的問題的動態規劃演算法進行討論,學會這一設計方法。多階段決策過程最優化問題 動態規劃的...
動態規劃1
首先,動態規劃的最基本要求在於無後效性 即結果態之和之前某態有關,並且對於該之前態我們並不關心它到底是怎麼來的 和n到n 1的跳躍一樣,它也是依賴轉移方程得來。比如0 1揹包 我們只要永遠依賴dp i j max dp i 1 j,dp i 1 j wi vi 這個轉移方程即可,並不在乎它具體細節。...