题目链接
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
struct node{
int v;
int w;
int tag;
}thing[60],pat[60][60];
void print(node a){
cout<<a.v<<" "<<a.w<<" "<<a.tag<<endl;
}
int t[60];
int cnt[60];
int f[33000];
int value[60][60];
int get[60][60];
int num;
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>thing[i].v>>thing[i].w>>thing[i].tag;
if(thing[i].tag>0){
num=++t[thing[i].tag];
pat[thing[i].tag][num].v=thing[i].v;
pat[thing[i].tag][num].w=thing[i].w;
pat[thing[i].tag][num].tag=thing[i].tag;
}
}
for(int i=1;i<=m;i++){
if(t[i]){
memset(f,-1,sizeof(f));
f[0]=0;
for(int j=1;j<=t[i];j++){
for(int k=n-thing[i].v;k>=pat[i][j].v;k--){
if(f[k]<f[k-pat[i][j].v]+pat[i][j].v*pat[i][j].w&&f[k-pat[i][j].v]!=-1)
f[k]=f[k-pat[i][j].v]+pat[i][j].v*pat[i][j].w;
}
}
for(int j=0;j<=n-thing[i].v;j++){
if(f[j]!=-1){
cnt[i]++;
value[i][cnt[i]]=thing[i].v+j;
get[i][cnt[i]]=thing[i].w*thing[i].v+f[j];
}
}
}
if(!thing[i].tag){
cnt[i]++;
value[i][cnt[i]]=thing[i].v;
get[i][cnt[i]]=thing[i].w*thing[i].v;
}
}
memset(f,0,sizeof(f));
for(int i=1;i<=m;i++){
for(int j=n;j>=0;j--){
for(int k=1;k<=cnt[i];k++){
if(j>=value[i][k])
f[j]=max(f[j],f[j-value[i][k]]+get[i][k]);
}
}
}
cout<<f[n]<<endl;
return 0;
}