動態規劃中的經典問題

2021-07-23 12:00:11 字數 896 閱讀 6926

01揹包:有n個重量和價值分別為wi,vi的物品。從這些物品中挑選出總重量不超過w的物品,求所有挑選方案中價值總和的最大值。

第一步:合理抽象問題

定義狀態:以dp(i, x)表示已經決定了前i件物品是否選取,當前已經選取的物品的重量總和不超過x時,能夠獲取的最高的價值的和。dp(n, w)即為所求。

我們先考慮dp(n, m)這個問題的最後乙個決策——第n件物品是否進行選擇:

選擇第n件物品且保證第n件物品的重量不超過m。則dp(n - 1, m - need(n)) + value(n)。」

不選擇第n件物品,則dp(n - 1, m)。

由於第n件獎品只有選取和不選取兩種可能,我們於是可以知道:

dp(n, m) = max

同理定義狀態轉移方程:對於任意i>1, j,dp(i, j)=max

通過不斷重複利用乙個陣列來優化空間:

完全揹包:

與01揹包的區別是,每件物品可以取多次。

將01揹包定義的狀態稍稍改變:

可得:因為best(i, x)的大部分計算都在best(i, x - need(i))中已經計算過了

所以可以優化成這樣:

for (int i = 1; i <= n; i++)

for (int j = 0; j <= m; j++)

if (need[i] > j)

dp[i][j] = dp[i-1][j];

else

dp[i][j] = max(dp[i-1][j], dp[i][j-need[i]] + value[i]);

同樣,用一維陣列優化空間:

for(i=0; i

動態規劃經典問題

from 實現在 維基百科對動態規劃的定義 動態規劃 英語 dynamic programming,簡稱dp 是一種在數學 電腦科學和經濟學中使用的,通過把原問題分解為相對簡單的子問題的方式求解複雜問題的方法。動態規劃常常適用於有重疊子問題 1 和最優子結構性質的問題,動態規劃方法所耗時間往往遠少於...

動態規劃經典問題

子串 在給定的字串中選取連續的一段 子串行 可以不連續,但是要保證出現的順序與原字串相同 比如字串abcdefg abc既是子串又是子串行 acd只是子串行 一 最大連續子串行和 給定乙個整數序列a1,a2 an。求最大的連續的子串行的和。比如的最大連續子串行的和為5 3 1 1 2 萬能列舉?每次...

動態規劃 經典問題

今天記錄下自己所學的動態規劃知識點 有三枚硬幣 2,5,7 拼成27元 最少需要幾枚硬幣 我自己理解的動態規劃實操兩部曲 第一曲 定義初始條件 第二曲 迴圈操作 以及狀態方程定義 我的第乙個動態規劃程式 題目資訊 有三枚硬幣 2,5,7 拼成27元 最少需要幾枚硬幣 看到最少 一般用動態規劃求解 1...