有依赖背包
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=55;
const int maxv=100005;
int tmp[maxv];
int f[maxn][maxv];
int N,V; //主件的数量,背包的容量
int main()
{
while(cin>>N>>V)
{
memset(f,0,sizeof(f));
for(int i=1;i<=N;i++)
{
memset(tmp,-1,sizeof(tmp));
int p,m; //主件的费用,附件的数量
cin>>p>>m;
for(int j=p;j<=V;j++)
tmp[j]=f[i-1][j-p];
int v,w;
for(int j=1;j<=m;j++)
{
cin>>v>>w; //每一个附件的重量和价值
for(int k=V;k>=v;k--)
if(tmp[k-v]!=-1)
tmp[k]=max(tmp[k],tmp[k-v]+w);
}
for(int j=V;j>=0;j--)
f[i][j]=max(tmp[j],f[i-1][j]);
}
cout<<f[N][V]<<endl;
}
return 0;
}