什麼是動態規劃?
動態規劃(dynamic programming,簡稱為dp)是運籌學的乙個分支,是求解決策過程(decision process)最優化的數學方法。20世紀50年代初美國數學家r.e.bellman等人在研究多階段決策過程(multistep decision process)的優化問題時,提出了著名的最優化原理(principle of optimality),把多階段過程轉化為一系列單階段問題,利用各階段之間的關係,逐個求解,創立了解決這類過程優化問題的新方法——動態規劃。2023年出版了他的名著《dynamic programming》,這是該領域的第一本著作。
動態規劃演算法通常基於乙個遞推公式及乙個或多個初始狀態。當前子問題的最優解將由上一次子問題的最優解推出。使用動態規劃來解題只需要多項式時間複雜度,因此它比回溯法、暴力法等要快許多。
問題:
如果我們有面值為1元、3元和5元的硬幣若干枚,如何用最少的硬幣湊夠11元?
分析:
用d(i)表示湊夠i元需要的最少硬幣數量,將它定義為該問題的」狀態「。這個狀態是怎麼找出來的呢?根據子問題來定義狀態,找到子問題,即 狀態。最終要求解的問題,可以用這個狀態來表示:d(11),即湊夠11元最少需要多少個硬幣。
那狀態轉移方程是什麼呢?既然我們用d(i)表示狀態,那麼狀態轉移方程自然包含d(i)。包含狀態d(i)的方程,比如:d(3)=min。沒錯,它就是狀態轉移方程,描述狀態之間是如何轉移的。當然,要對它抽象一下,d(i)=min,其中i-vj >=0,vj表示第j個硬幣的面值。有了狀態和狀態轉移方程,這個問題基本上也就解決了。
求解:
int main()
, sum = 11, dp[12];
dp[0] = 0;
for(int i = 1; i <= sum; i++) dp[i] = i; // 假設存在1元的硬幣那麼i元最多隻需要i枚1元硬幣,當然最好設定dp[i]等於無窮大
for(int i = 1; i <= sum; i++)
} }
cout0;
}
**: 動態規劃 湊硬幣 C 實現
file name dp coin.cpp function 動態規劃 湊硬幣 c 實現 created on 2016年6月28日 author beijiwei qq.com 任何單位和個人不經本人允許不得用於商業用途 有1元,3元,5元面值的硬幣若干枚,求湊齊11元需要的最小硬幣數.inclu...
動態規劃演算法 湊硬幣
動態規劃演算法是電腦科學演算法中最重要也是最常用的乙個演算法,巧妙的利用它可以解決很多複雜的問題,另外也頻繁的出現在各大網際網路公司的面試中,因此掌握它是十分必要的。但該演算法對於初學者來說,要想徹底的掌握理解它並非易事,本系列教程將帶領大家一起來學習該演算法,通過經典的案列介紹和解題分析,試圖歸納...
動態規劃 硬幣問題
這是乙個固定重點的最長路和最短路問題,可用動態規劃問題來求解 代表硬幣總值,n代表硬幣總數,v陣列儲存硬幣各個面值,d代表從i出發到結點0的路徑的最長路徑長度或最短路徑長度 vis代表是否訪問過該結點 int n,s,v maxn d maxn vis maxn int dpmax int s re...