有依赖的DP,标准写法是树形的但是听说这题会t……
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define down(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
#define M 40000
#define N 100
int f[M];
int w[N],c[N],lin[N],dfn[N][N];
int n,m,ans=0;
void ini()
{
scanf("%d%d",&m,&n);
fo(i,1,n)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
w[i]=x;c[i]=x*y;lin[i]=z;
if(z)dfn[z][++dfn[z][0]]=i;
}
}
void DP()
{
fo(i,1,n)
if(lin[i]==0)
down(j,m,w[i])
{
f[j]=max(f[j],f[j-w[i]]+c[i]);
int t=j-w[i];
if(dfn[i][0]&&t-w[dfn[i][1]]>=0)
{
f[j]=max(f[j],f[t-w[dfn[i][1]]]+c[i]+c[dfn[i][1]]);
}
if(dfn[i][0]>1)
{
if(t-w[dfn[i][2]]>=0)
{
f[j]=max(f[j],f[t-w[dfn[i][2]]]+c[i]+c[dfn[i][2]]);
}
t-=w[dfn[i][1]]+w[dfn[i][2]];
if(t>=0)
{
f[j]=max(f[j],f[t]+c[i]+c[dfn[i][1]]+c[dfn[i][2]]);
}
}
ans=max(ans,f[j]);
}
}
void OUT()
{
cout<<ans<<endl;
}
int main()
{
ini();
DP();
OUT();
// system("pause");
return 0;
}