#include<iostream>
using namespace std;
const int N = 101;
int q[N],V[N],W[N];
int main(){
int n,m;
cin>>n>>m;
for(int i = 0;i<n;i++){
int s;
cin>>s;
for(int j = 0;j<s;j++){
cin>>V[j]>>W[j];//分组
}
for(int j = m ;j>=0;j--){
for(int k = 0;k<s;k++){
if(j<V[k])
continue;//要遍历完一组(刚刚竟然想不出用continue与break的区别。。。)
q[j] = max(q[j],q[j-V[k]]+W[k]);//每组在相应体积下的最大价值
//先塞最有价值的,等容量不够了自然有价值小体积也小的填充;
}
}//若这两重循环调换则每组数据会成为一个单独的01背包问题
}
cout<<q[m];
return 0;
}
上次立的flag不到几天就实现了。。。(岂可修)