DTL_2010 @ 2024-05-12 16:38:45
#include<bits/stdc++.h>
using namespace std;
vector<int> v[100], w[100];
int n, m, dp[32768];
int main(){
cin >> m >> n;
for(int i = 1; i <= n; i++){
int x, y, z;
cin >> x >> y >> z;
if(z != 0){
for(int j : v[z]) v[z].push_back(x*y+j);
for(int j : w[z]) w[z].push_back(x+j);
}
else{
v[i].push_back(x*y);
w[i].push_back(x);
}
}
for(int i = 1; i <= n; i++)
for(int j = m; j >= 0; j--)
for(int k = 0; k < v[i].size(); k++)
if(j >= w[i][k]) dp[j] = max(dp[j], dp[j-w[i][k]]+v[i][k]);
cout << dp[m];
return 0;
}
by mooktian @ 2024-05-20 10:40:40
@DTL_2010 思路要理顺啊,这题就是有依赖的01背包,依赖关系可以做成一个分组,每个分组里面可能包含有:主件,主件+附件1,主件+附件2,主件+附件1+附件2。
处理完以后就按照01背包分组的模版去写就好了。
你这个怎么处理的我没有看懂。