小超的记忆是个问题,虽然很多东西都写过,但就是忘了。
千锤百炼成钢,不知道要做多少题目才能记住(^_^)
分组背包,现在有
个组,第
组里面有
件商品,每件商品都有它的价值
与体积
;但是每个组里面的商品最多选择一件,求总容量为
时的最大价值。
与
背包大差不差,需要注意外层循环为体积,内层循环为商品,这样保证了每一个体积只会被当前
件商品中的一件商品更新一次,这样就解决了每个组里面的商品最多选择一件这个问题。
总代码:
#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;
}



京公网安备 11010502036488号