分组背包问题
有 NN 组物品和一个容量是 VV 的背包。
每组物品有若干个,同一组内的物品最多只能选一个。
每件物品的体积是 vijvij,价值是 wijwij,其中 ii 是组号,jj 是组内编号。
求解将哪些物品装入背包,可使物品总体积不超过背包容量,且总价值最大。
输出最大价值。
输入格式
第一行有两个整数 N,VN,V,用空格隔开,分别表示物品组数和背包容量。
接下来有 NN 组数据:
- 每组数据第一行有一个整数 SiSi,表示第 ii 个物品组的物品数量;
- 每组数据接下来有 SiSi 行,每行有两个整数 vij,wijvij,wij,用空格隔开,分别表示第 ii 个物品组的第 jj 个物品的体积和价值;
输出格式
输出一个整数,表示最大价值。
1 #include<iostream> 2 #include<algorithm> 3 4 using namespace std; 5 6 const int N=110; 7 int dp[N]; 8 int w[N][N],v[N][N],s[N]; 9 int n,m; 10 11 int main() 12 { 13 cin>>n>>m; 14 15 for(int i=1;i<=n;i++) 16 { 17 cin>>s[i]; 18 for(int j=1;j<=s[i];j++) 19 cin>>v[i][j]>>w[i][j]; 20 } 21 22 for(int i=1;i<=n;i++) 23 for(int j=m;j>=0;j--) 24 for(int k=0;k<=s[i];k++) 25 if(j>=v[i][k]) 26 dp[j]=max(dp[j],dp[j-v[i][k]]+w[i][k]); 27 28 cout<<dp[m]<<endl; 29 30 return 0; 31 }