01揹包問題

2021-08-10 09:17:17 字數 1289 閱讀 6179

問題描述

給定n個物品,每個物品有乙個重量w和乙個價值v.你有乙個能裝m重量的揹包.問怎麼裝使得所裝價值最大.每個物品只有乙個.

輸入格式

輸入的第一行包含兩個整數n, m,分別表示物品的個數和揹包能裝重量。

以後n行每行兩個數wi和vi,表示物品的重量和價值

輸出格式

輸出1行,包含乙個整數,表示最大價值。

樣例輸入

3 52 3

3 54 7

樣例輸出

8資料規模和約定

1<=n<=200,m<=5000.

狀態:f(i,j) 表示揹包可用容量為j(1<=j<=w),已考慮物品 1,2,3, ... ,i(1<=i<=n) 時的最優解的值。

狀態方程:

f(i,j)=f(i-1,j) j=w[i]時,在放入和不放入物品i之間選最優解

邊界條件:

f(i,0)=0 揹包不能裝入任何物品,總價值為0

f(0,j)=0 沒有任何物品裝入,總價值為0

方法1:

#include #include using namespace std;

int main()

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

f[i][0]=0;

for(int i=0; i<=c; i++)

f[0][i]=0;

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

/* | 0 i=0 or w=0

f[i,w]=| f[i-1,w] wi>w

| max(vi+f[i-1,w-wi],f[i-1,w]) i>0 and w>=wi

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

//陣列多申請乙個元素,容量從0~c,

int dp[c+1];

memset(dp,0,sizeof(dp));

for(int i=0;i0;j--) //j為揹包容量,其中容量為0時,價值勢必為0,所以更新dp時,不用迴圈dp[0]

}cout其中**的第24~31行可以簡化,如下:

for(int i=0; i=weight[i]; j--) //j為揹包容量,其中容量為0時,價值勢必為0,所以更新dp時,不用迴圈dp[0]

}

揹包問題 01揹包問題

n個物品,總體積是v,每個物品的體積的vi,每個物品的最大價值是wi,在不超過v的體積下求最大價值 eg揹包容積為 5 物品數量為 4 物品的體積分別為 物品的價值分別為 思路定義乙個二位陣列int f new int n 1 v 1 f i j 就表示在1 i個物品中選取體積小於v的情況的最大價值...

揹包問題 01揹包

有n件物品和乙個容量為v的揹包。第i件物品的重量是c i 價值是w i 求解將哪些物品裝入揹包可使價值總和最大。01揹包中的 01 就是一種物品只有1件,你可以選擇放進去揹包即1,也可以選擇不放入揹包中即0。include include using namespace std const int ...

揹包問題(01揹包)

1085 揹包問題 在n件物品取出若干件放在容量為w的揹包裡,每件物品的體積為w1,w2 wn wi為整數 與之相對應的價值為p1,p2 pn pi為整數 求揹包能夠容納的最大價值。input 第1行,2個整數,n和w中間用空格隔開。n為物品的數量,w為揹包的容量。1 n 100,1 w 10000...