分组背包问题
题目释义
给定若干组,每组中有若干个物品,每组中只能选择一个物品,要求在不超过背包容量的情况下找出价值之和最高的价值数
算法思想:
将每组物品中每个物品都用二维数组进行标记,在找物品的过程中使用01背包问题的类似方式,加上三重循环来依次遍历第i
组中的每个物品
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 110;
int n,m;
int s[N],f[N];
int w[N][N],v[N][N];
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>s[i];
for(int j=0;j<s[i];j++){
cin>>v[i][j]>>w[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=m;j>=0;j--){
for(int k=0;k<s[i];k++){
if(v[i][k]<=j) f[j]=max(f[j],f[j-v[i][k]]+w[i][k]);
}
}
}
cout<<f[m];
return 0;
}