動態規劃(0 1揹包問題)

2021-07-23 18:16:08 字數 1281 閱讀 5599

一、主要概念

使用動態規劃求解問題,最重要的是確定動態規劃三要素:

(1)問題的階段

(2)每個階段的狀態

(3)從前乙個階段轉化到下乙個階段之間的遞推關係

確定了動態規劃的這三要素,整個求解過程就可以用乙個最優決策表來描述,最優決策表是乙個二維表,其中行表示決策的階段,列表示問題的狀態,**需要填寫的資料一般

對應此問題的在某個階段某個狀態下的最優值(如最短路徑、最長公共子串行、最大價值等)

二、動態規劃在(0-1)揹包問題中的應用

1、那麼對應動態規劃求解的三要素,考慮(0-1)揹包問題:

(1)問題的階段是由物品序列確定的(依次為:僅考慮前乙個物品(可以認為是第乙個階段);僅考慮前兩個物品(可以認為是第二個階段);僅考慮前三個物品(可以認為是 第三個階段).......)

(2)每個階段的狀態,這個狀態是由揹包容量序列來確定的。(也可以認為i,j確定乙個唯一狀態)

(3)這個是動態規劃的核心,也即狀態轉移。這一步主要是在判斷要不要把第i個物品,放入到狀態(容量)為j的揹包裡面。判斷的條件為,包含物品i(f(n-1,m-w[n])+v(n,m))和不包含物品i(f(n-1,m))的價值比較。

2、解釋式子f(i-1,j-w[i])+v[i]

如果將物品i放入到揹包裡面,需要在總共的空間j裡面騰出w[i]的空間,然後加上物品i的價值。

其實這個式子用到了動態規劃的兩個性質:

(1)最優化原理:如果問題的最優解所包含的子問題的解也是最優的,就稱該問題具有最優子結構,即滿足最優化原理。

(2)無後效性:即某階段某一狀態一旦確定,就不受這個狀態以後決策的影響。也就是說,某狀態以後的過程不會影響以前的狀態,只與當前狀態有關。

3、實際程式設計

題目描述:

有編號分別為a,b,c,d,e的五件物品,它們的重量分別是2,2,6,5,4,它們的價值分別是6,3,5,4,6,現在給你個承重為10的揹包,如何讓揹包裡裝入的物品具有最大的價值總和?

#include#includeusing namespace std;

#define n 5

#define m 10

#define max(x,y) (x)>(y)?(x);(y)

int main()

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

else

else

}} }

cout << f[n][m]<

動態規劃揹包問題 01揹包

問題描述 n種物品,每種乙個。第i種物品的體積為vi,重量為wi。選一些物品裝到容量為c的揹包,使得揹包內物品不超過c的前提下,重量最大。問題分析 宣告乙個f n c 的陣列。f i j 表示把前i件物品都裝到容量為j的揹包所獲得的最大重量。當 j v i 時,揹包容量不足以放下第 i 件物品,f ...

動態規劃 揹包問題 01揹包

有n種物品和乙個容量為v的揹包,每種物品僅用一次。第i件物品的費用是w i 價值是v i 求解將哪些物品裝入揹包可使價值總和最大。例如 n 5,v 10 重量 價值 第乙個物品 10 5 第二個物品 1 4 第三個物品 2 3 第四個物品 3 2 第五個物品 4 1 首先我們考慮貪心策略,選取最大價...

0 1揹包問題(動態規劃)

一 問題描述 有n件物品和乙個容量為v的揹包。第i件物品的費用是c i 價值是w i 求解將哪些物品裝入揹包可使價值總和最大。所謂01揹包,表示每乙個物品只有乙個,要麼裝入,要麼不裝入。二 解決方案 考慮使用動態規劃求解,定義乙個遞迴式 opt i v 表示前i個物品,在揹包容量大小為v的情況下,最...