https://www.luogu.org/problem/P1064
#include <stdio.h>
#define max(a,b) a>b?a:b
#define min(a,b) a>b?b:a
#define ll long long
#define maxn 32010
int read()
{
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){s=s*10+ch-'0',ch=getchar();}
return s*w;
}
int v[61],w[61],q[61],f[maxn],h[maxn];
int main()
{
int n=read(),m=read();
for(int i=1;i<=m;i++)
{
v[i]=read(),w[i]=read(),q[i]=read();
w[i]*=v[i];
}
for(int i=1;i<=m;i++)
if(!q[i]) //是主件
{
for(int j=1;j<v[i];j++) //h储存当选这个主件的背包值
h[j]=0;
for(int j=v[i];j<=n;j++)
h[j]=f[j-v[i]]+w[i];
for(int j=1;j<=m;j++)
if(q[j]==i)
for(int k=n;k>=v[i]+v[j];k--)
h[k]=max(h[k],h[k-v[j]]+w[j]);
for(int j=v[i];j<=n;j++) //通过比较决定要不要选这个主件
f[j]=max(f[j],h[j]);
}
printf("%d",f[n]);
}