0/1背包问题;
一维可以看看其他大佬的代码;
如果是用二维结构写的,那一定要注意将上一轮的状态更新到这一轮;
using namespace std;
const int N = 1010,M = 1010;
int w[N][M],v[N][M],a[N],f[N][N];
void solve()
{
int n,m;cin>>n>>m;
for(int i = 1;i <= n; i++){
cin>>a[i];
for(int j = 1;j <= a[i]; j++){
cin>>v[i][j];//收益
}
for(int j = 1;j <= a[i]; j++){
cin>>w[i][j];//体力
}
}
memset(f,0,sizeof(f));
//前i个模式中花费了j体力
for(int i = 1;i <= n; i++){
for(int j = 0;j <= m; j++){
f[i][j] = f[i-1][j];//复制上一轮状态,或者直接让k从0开始
for(int k = 1;k <= a[i]; k++){//操作k
if(j >= w[i][k]){
f[i][j] = max(f[i][j],f[i-1][j-w[i][k]]+v[i][k]);
}
}
}
}
cout<<f[n][m]<<'\n';
}
int main()
{
int i,j;
int t;cin>>t;
while(t--) solve();
return 0;
}