关于分组背包传送门

code

#include <bits/stdc++.h>

using namespace std;

const int maxn = 1e3 + 5;

int dp[maxn],val[maxn][maxn],w[maxn][maxn];
int num[maxn];

void Solve(int n,int m)
{
    memset(dp, 0, sizeof dp);
    for(int i = 1; i <= n; i++){
        cin>>num[i];
        for(int j = 1; j <= num[i]; j++) cin>>val[i][j];
        for(int j = 1; j <= num[i]; j++) cin>>w[i][j];
    }
    for(int i = 1; i <= n; i++){
        for(int j = m; j >= 0; j--){
            for(int k = 1; k <= num[i]; k++){
                if(j >= w[i][k]) dp[j] = max(dp[j],dp[j - w[i][k]] + val[i][k]);
            }
        }
    }
    cout<<dp[m]<<endl;
}

int main()
{
    int t;
    cin>>t;
    while(t--){
        int n,m;
        cin>>n>>m;
        Solve(n,m);
    }
    return 0;
}