小超的记忆是个问题,虽然很多东西都写过,但就是忘了。
千锤百炼成钢,不知道要做多少题目才能记住(^_^)

分组背包,现在有个组,第组里面有件商品,每件商品都有它的价值与体积;但是每个组里面的商品最多选择一件,求总容量为时的最大价值。
背包大差不差,需要注意外层循环为体积,内层循环为商品,这样保证了每一个体积只会被当前件商品中的一件商品更新一次,这样就解决了每个组里面的商品最多选择一件这个问题。

总代码:
#include<bits/stdc++.h>
using namespace std;

#define endl '\n'
#define int long long
#define IOS ios::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#define HelloWorld IOS;


void solve(){
    int n, m; cin >> n >> m;
    vector<int> dp(m + 1);
    for(int i = 1; i <= n; i ++){
        int k; cin >> k;
        vector<int> v(k + 1), w(k + 1);
        for(int j = 1; j <= k; j ++) cin >> w[j];
        for(int j = 1; j <= k; j ++) cin >> v[j];
        for(int j = m; j >= 0; j --){
            for(int z = 1; z <= k; z ++){
                if(j >= v[z]){
                    dp[j] = max(dp[j], dp[j - v[z]] + w[z]);
                }
            }
        }
    }
    cout << dp[m] << endl;
}
signed main(){
    HelloWorld;
    
    int tt; cin >> tt;
    while(tt --) solve();
    return 0;
}