/首先明确一下这个题目与0,1背包 区别:
1.N含义变了,N从N个变成了N组,每一组有s[i]个物品,但是每一组物品只能用一个。
所以变量:
const int N=110;
int n,m;(组数和背包容量)
f[N];(表示体积为N的最大价值,事实上N不一定全用)
int v[N][N],w[N]N
int sN
下面来解决与0,1背包不同的地方;
因为每一组只能用一次,所在组数体积循环时,下面再用一个循环即可解决;
代码:/
#include<iostream>
#include<algorithm>
using namespace std;
const int N=110;
int n,m;
int v[N][N],w[N][N];
int s[N],f[N];
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>s[i];
for(int k=1;k<=s[i];k++)
cin>>v[i][k]>>w[i][k];
}/*数据输入*/
for(int i=1;i<=n;i++)
for(int j=m;j>=0;j--)
for(int k=1;k<=s[i];k++)
if(j>=v[i][k])
f[j]=max(f[j],f[j-v[i][k]]+w[i][k]);/*在i和j都不变时看每一个k值对应的物品;由于当前状态下的f[j-任何大于0的数][k]在这一轮i中是未被算过的(事实上是i-1的状态,即上一轮循环.注意是j--);所以我们的这一步不会对数据产生影响,而k的循环也就是将这一组内每一个物品在方程转化后取一个最大值。所以只用了一个物品。*/
cout<<f[m]<<endl;
return 0;
}