#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<algorithm>#include<vector>usingnamespace std;typedef pair<int,int> PII;constint N =60, M =32010;int n, m;
PII master[N];
vector<PII> servent[N];int f[M];intmain(){
cin >> m >> n;for(int i =1; i <= n; i++){int v, p, q;
cin >> v >> p >> q;if(!q){//主件
master[i]={v, v * p};}else{//附件
servent[q].push_back({v, v * p});}}for(int i =1; i <= n; i++){//物品for(int j = m; j >=0; j--){//体积for(int k =0; k <(1<< servent[i].size()); k++){//决策int v = master[i].first, w = master[i].second;for(int l =0; l < servent[i].size(); l++){//二进制枚举每一位if(k >> l &1){
v += servent[i][l].first;
w += servent[i][l].second;}}if(j >= v) f[j]=max(f[j], f[j - v]+ w);}}}
cout << f[m]<< endl;return0;}
题面题解(有依赖的分组背包)我们可以将每一个主件和其附件看作一个物品组,根据题中要求,我们将主件设为a,附件设为1,2 ;那么最多有4中组合 , a , a 1 a 2 a 1 2 ,这四组组合是互斥的,最多只能选择其中的一种,,这样就转化成了分组背包问题在枚举组合的时候,我们可以用2进制枚举,比如 3 (10),那么就表示选择第一个附件,不选第二个附件时间复杂度 物品总数 * 总体积 O(Nm)代码#include<iostream>#includ