分析:
背包,写的时候记住
不要手残
这里写代码片
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int N=100005;
int f[32005];
int w[N],v[N],tot=0;
int fj[N][2];
bool p[N];
int n,m;
int main()
{
scanf("%d%d",&n,&m);
memset(p,1,sizeof(p));
for (int i=1;i<=m;i++)
{
int u,e,z;
scanf("%d%d%d",&u,&e,&z);
w[i]=u; v[i]=e*u;
if (z) //附件
p[i]=0,fj[z][fj[z][0]==0 ? 0:1]=i;
}
for (int i=1;i<=m;i++)
for (int j=n;j>=w[i];j--)
if (p[i])
{
f[j]=max(f[j],f[j-w[i]]+v[i]);
if (fj[i][0]&&j>=w[i]+w[fj[i][0]])
f[j]=max(f[j],f[j-w[i]-w[fj[i][0]]]+v[i]+v[fj[i][0]]);
if (fj[i][1]&&j>=w[i]+w[fj[i][1]])
f[j]=max(f[j],f[j-w[i]-w[fj[i][1]]]+v[i]+v[fj[i][1]]);
if (fj[i][0]&&fj[i][1]&&j>=w[i]+w[fj[i][0]]+w[fj[i][1]])
f[j]=max(f[j],f[j-w[i]-w[fj[i][0]]-w[fj[i][1]]]+v[i]+v[fj[i][0]]+v[fj[i][1]]);
}
printf("%d",f[n]);
return 0;
}