分组方法:一主多仆情况利用主仆数组,下标为k的仆数组存储主数组编号为k的仆人。
遍历一组数的可以选择的多种情况,for(int i=0;i<1<<k;i++) (k为共有多少数)
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;
const int N=32100;
const int M=100;
pii master[M];
vector<pii> servent[M];//fei chang niu bi de fenzu caozuo
int dp[N];
int n,m;
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
int v,p,q;
cin>>v>>p>>q;
p=p*v;
if(q==0){
master[i]={v,p};
}
else{
servent[q].push_back({v,p});
}
}
for(int i=1;i<=m;i++){
if(master[i].second!=0){
for(int j=n;j>=master[i].first;j--){
for(int k=0;k<1<<servent[i].size();k++){//fei chang niubi de zuneixuanze
int a=master[i].first,b=master[i].second;
for(int l=0;l<servent[i].size();l++){
if((k>>l)&1){
a=a+servent[i][l].first;
b=b+servent[i][l].second;
}
}
if(j-a>=0){
dp[j]=max(dp[j],dp[j-a]+b);
}
}
//dp[j]=max(dp[j],dp[j-a]+b);
}
}
}
cout<<dp[n];
return 0;
}