Paul_Ac @ 2016-11-06 16:08:57
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#include<cstring>
int f[100][40000];
int v[100];
int w[100];
int p[100];
int a[100][3][3];//附件
int b[100][3];//主件
int n,m;
int max(int x,int y)
{
if(x>y) return x;
else return y;
}
int main()
{
scanf("%d %d",&n,&m);
int q=0;
for(int i=1;i<=m;i++)
{
int x,y,z;
scanf("%d %d %d",&x,&y,&z);
if(z==0)
{
q++;
b[q][0]=x;//价格
b[q][1]=y;//重要
}
else
{
if(a[z][0][1]==0)
{
a[z][0][0]=x;//价格
a[z][0][1]=y;//重要
}
else
{
a[z][1][0]=x;
a[z][1][1]=y;
}//附件2
}
}
int x=1;//总计数
int y=1;//主件个数
while(x<=m)//v价格,w重要,p
{
v[x]=b[y][0];
w[x]=b[y][1];
p[x]=0;
if(a[y][0][0]!=0)
{
x++;
v[x]=a[y][0][0];
w[x]=a[y][0][1];
p[x]=1;
if(a[y][1][0]!=0)
{
x++;
v[x]=a[y][1][0];
w[x]=a[y][1][1];
p[x]=1;
}
}
x++;
y++;
}
for(int i=1;i<=m;i++)
for(int j=n;j>=0;j--)
if(j>=v[i]&& p[i]==0 )//判断主件
{
f[i][j]=max(f[i-1][j-v[i]]+v[i]*w[i],f[i-1][j]);
if(j>=v[i]+v[i+1] && p[i+1]!=0 )
f[i][j]=max(f[i-1][j-v[i]-v[i+1]]+v[i]*w[i]+v[i+1]*w[i+1],f[i-1][j]);
if(j>=v[i]+v[i+2] && p[i+2]!=0 )
f[i][j]=max(f[i-1][j-v[i]-v[i+2]]+v[i]*w[i]+v[i+2]*w[i+2],f[i-1][j]);
if(j>=v[i]+v[i+1]+v[i+2] && p[i+1]!=0 && p[i+2]!=0)
f[i][j]=max(f[i-1][j-v[i]-v[i+1]-v[i+2]]+v[i]*w[i]+v[i+1]*w[i+1]+v[i+2]*w[i+2],f[i-1][j]);
}
else f[i][j]=f[i-1][j];
printf("%d",f[m][n]);
return 0;
}