揹包九講(3)
阿新 • • 發佈:2022-04-19
揹包九講(3)
多重揹包問題 I
有 N 種物品和一個容量是 V 的揹包。
第 ii 種物品最多有 si 件,每件體積是 vi,價值是 wi。
求解將哪些物品裝入揹包,可使物品體積總和不超過揹包容量,且價值總和最大。
輸出最大價值。
輸入格式
第一行兩個整數,N,V,用空格隔開,分別表示物品種數和揹包容積。
接下來有 N 行,每行三個整數 vi,,wi,si,用空格隔開,分別表示第 i 種物品的體積、價值和數量。
輸出格式
輸出一個整數,表示最大價值。
資料範圍
0<N,V≤1000<N,V≤100
0<vi,wi,si≤1000<vi,wi,si≤100
輸入樣例
4 5 1 2 3 2 4 1 3 4 3 4 5 2
輸出樣例:
10
思路:
本題在瞭解過01揹包和完全揹包問題後較為簡單,就是在選擇拿時要考慮拿幾個。同時n,v最大為100,可以使用最簡單的三重遍歷,優化一下01揹包即可。
#include<iostream> #include<cstring> #include<algorithm> using namespace std; const int N=1010; int v[N];//物品體積 int w[N];//價值 int c[N];//數量 int f[N];//揹包大小為N時的最大價值 int main(){ int n,m; cin>>n>>m; for(int i=0;i<n;i++)cin>>v[i]>>w[i]>>c[i]; //01揹包模板 for(int i=0;i<n;i++){//列舉物品 for(int j=m;j>=0;j--){//體積從大到小 //拿幾件 for(int k=0;k<=c[i]&&j>=k*v[i];k++){ f[j]=max(f[j],f[j-k*v[i]]+k*w[i]); } } } cout<<f[m]; }