給定n個物品,每個物品有乙個重量w和乙個價值v.你有乙個能裝m重量的揹包.問怎麼裝使得所裝價值最大.每個物品只有乙個.
輸入格式
輸入的第一行包含兩個整數n, m,分別表示物品的個數和揹包能裝重量。
以後n行每行兩個數wi和vi,表示物品的重量和價值
輸出格式
輸出1行,包含乙個整數,表示最大價值。
樣例輸入
3 52 3
3 54 7
樣例輸出
資料規模和約定
1<=n<=200,m<=5000.
這道題就是最經典,最簡單的01揹包問題了,直接用01揹包就可以得到結果。
關於01揹包,就是有n件物品,乙個揹包能夠放入的重量是m,讓你求出來揹包中物品的最大價值;
對於揹包,我們可以找到乙個遞推公式:
(1)當揹包中剩餘可放入物品的重量比這件物品的重量小,那麼這件物品不能放入揹包中;
(2)當揹包中剩餘可放入物品的重量比這件物品的重量大,那麼這件物品可以放入揹包中,也可以不放進揹包中;
用乙個二維陣列來記錄這個判斷的過程:dp[ ][ ] ;
其中,dp[x ][y ]=z:代表,現在在前x件物品中進行選擇,揹包剩餘的重量是y,其中,現在這種情況下揹包中最大的價值是z;
那麼上面的遞推公式就可以表示為:
dp[i][j]=dp[i-1][j];
//揹包放不進去了,那麼這件物品不能選,所以在前i件物品中選擇的最大的價值和前面i-1件物品中進行選擇的最大的價值相同;
dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]);
//揹包可以放進去這件物品,那麼在前i見物品中進行的選擇的物品可能會被替換,換或者不換有兩種結果,要從這兩種結果中選出來最優的結果;上面的式子即使選和不選兩種結果的抉擇;
#include#include#includeusing namespace std;
int n,m;
int w[5010],v[5010];
int dp[5010][5010];
int main()
for(int i=1; i<=n; i++)//數量;
}printf("%d\n",dp[n][m]);
}return 0;
}
藍橋杯 演算法提高 01揹包
問題描述 給定n個物品,每個物品有乙個重量w和乙個價值v.你有乙個能裝m重量的揹包.問怎麼裝使得所裝價值最大.每個物品只有乙個.輸入格式 輸入的第一行包含兩個整數n,m,分別表示物品的個數和揹包能裝重量。以後n行每行兩個數wi和vi,表示物品的重量和價值 輸出格式 輸出1行,包含乙個整數,表示最大價...
藍橋杯 ADV 144 演算法提高 01揹包
演算法提高 01揹包 時間限制 1.0s 記憶體限制 256.0mb 問題描述 給定n個物品,每個物品有乙個重量w和乙個價值v.你有乙個能裝m重量的揹包.問怎麼裝使得所裝價值最大.每個物品只有乙個.輸入格式 輸入的第一行包含兩個整數n,m,分別表示物品的個數和揹包能裝重量。以後n行每行兩個數wi和v...
藍橋杯 01揹包
演算法提高 01揹包 時間限制 1.0s 記憶體限制 256.0mb 問題描述 給定n個物品,每個物品有乙個重量w和乙個價值v.你有乙個能裝m重量的揹包.問怎麼裝使得所裝價值最大.每個物品只有乙個.輸入格式 輸入的第一行包含兩個整數n,m,分別表示物品的個數和揹包能裝重量。以後n行每行兩個數wi和v...