思路:
这种依赖把附件接到主件上,用01背包即可。
#include<bits/stdc++.h>
using namespace std;
const int inf=0x7ffffff;
int dp[160005];
vector<int > a[65],b[65];
struct node{
int v,p,q;
}t[65];
int main(){
int n,m;
cin>>n>>m;
n/=10;
int cnt0=1;
for(int i=1;i<=m;i++){
int x,y,z;
cin>>x>>y>>z;
x/=10;
if(z==0){
a[i].push_back(x);
b[i].push_back(y);
}
else{
t[cnt0].v=x;
t[cnt0].p=y;
t[cnt0++].q=z;
}
}
for(int i=1;i<cnt0;i++){
a[t[i].q].push_back(t[i].v);
b[t[i].q].push_back(t[i].p);
}
memset(dp,0,sizeof(dp));
for(int i=1;i<=m;i++){
for(int j=0;j<3;j++){
a[i].push_back(0);
b[i].push_back(0);
}
}
for(int i=1;i<=m;i++){
if(a[i][0])
for(int j=n;j>=a[i][0];j--){
dp[j]=max(dp[j],dp[j-a[i][0]]+a[i][0]*b[i][0]);
if(b[i][1]&&j-a[i][0]-a[i][1]>=0)
dp[j]=max(dp[j],dp[j-a[i][0]-a[i][1]]+a[i][0]*b[i][0]+a[i][1]*b[i][1]);
if(b[i][2]&&j-a[i][0]-a[i][2]>=0)
dp[j]=max(dp[j],dp[j-a[i][0]-a[i][2]]+a[i][0]*b[i][0]+a[i][2]*b[i][2]);
if(b[i][1]&&b[i][2]&&j-a[i][0]-a[i][1]-a[i][2]>=0)
dp[j]=max(dp[j],dp[j-a[i][0]-a[i][1]-a[i][2]]+a[i][0]*b[i][0]+a[i][1]*b[i][1]+a[i][2]*b[i][2]);
}
}
cout<<dp[n]*10<<endl;
return 0;
}