動態規劃 01 揹包問題

2021-06-20 14:04:36 字數 1880 閱讀 7904

01 揹包問題是很典型的 動態規劃問題  

問題描述 :  現在有n件商品, 他們的重量和價值分別為 wi 和vi  但是你的包最大承受重量是e 現在要那你求出  方案中價值最大是多少?

解題方法: 首先要裝東西 ,選取若干件 東西放入包中  

1 .其中要判斷當放n件物品時能不能放的下 

2. 要判斷放這個和 不放這個物品 哪個價值能大些;

由上可以知道 , 利用到動態規劃的性質;分為取和不取即可進行搜尋 

下面有兩種源**進行解題, 但是他們的複雜度各部相同

源**  複雜度較小型:

#include#include#includeusing namespace std;

#define max 1000

int w[max], v[max];

int dp[max][max];

int n, e;

int rec(int i , int j)

else if(j < w[i])

else

return dp[i][j] = res;

}int main()

cin>>e; //輸入包所能承受的最大重量

int ans = rec(0, e);

cout<

以上複雜度減小的原因是因為 , 每次搜尋一次 便記錄一次資料,因此複雜度縮小了, 一共有n種 複雜度為o(ne)

下面是一種複雜度較高的演算法:

#include#includeusing namespace std;

#define max 100

int n, m;

int w[max],v[max]; //w 用來儲存重量 v用來儲存價值

int rec(int i , int j)

else if(j < w[i])

else

return res;

}int main()

cout《以上複雜度較高是因為每次都要搜尋一次 才可以完成計算  一共要進行 o(2^n) 次 每次都要考慮取或者 不取,所以一共有 2^n 情況 

下面試測試資料  :

4 2 3 1 2 3 4 2 2

5

步驟1-找子問題:子問題必然是和物品有關的,對於每乙個物品,有兩種結果:能裝下或者不能裝下。第一,包的容量比物品體積小,裝不下,這時的最大價值和前i-1個物品的最大價值是一樣的。第二,還有足夠的容量裝下該物品,但是裝了不一定大於當前相同體積的最優價值,所以要進行比較。由上述分析,子問題中物品數和揹包容量都應當作為變數。因此子問題確定為揹包容量為j時,求前i個物品所能達到最大價值。

步驟2-確定狀態:由上述分析,「狀態」對應的「值」即為揹包容量為j時,求前i個物品所能達到最大價值,設為dp[i][j]。初始時,dp[0][j](0<=j<=v)為0,沒有物品也就沒有價值。

步驟3-確定狀態轉移方程:由上述分析,第i個物品的體積為w,價值為v,則狀態轉移方程為

#includeint max(int a, int b)//取最大值函式

struct thing

list[101];

int dp[101][1001];

int main()

for (int i = 0; i <= s; i++) dp[0][i] = 0;//初始化二維陣列

for (int i = 1; i <= n; i++)//迴圈每個物品,執行狀態轉移方程

for (int j = list[i].w - 1; j >= 0; j --)

}printf("%d\n", dp[n][s]);

}return 0;

}

動態規劃揹包問題 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的情況下,最...