#include <bits/stdc++.h>
using namespace std;
int n,m,v[65],pp[65],q[65];
struct node{
int val,val1,val11,val2,v,v1,v11,v2,p,p11,p1,p2,q,pos,num;
}a[65];
int f[65][32005];
int main()
{
cin >> n >> m;
int p = 1;
for (int i = 1;i <= m;i++)
{
cin >> v[i] >> pp[i] >> q[i];
if (q[i] == 0)
{
a[p].val = pp[i] * v[i];
a[p].v = v[i];
a[p].q = q[i];
a[p].pos = i;
a[p].num = 0;
p++;
}
}
p--;
for (int i = 1;i <= p;i++)
{
for (int j = 1;j <= m;j++)
{
if (q[j] == a[i].pos)
{
if (a[i].num == 0)
{
a[i].val1 = a[i].val + pp[j] * v[j];
a[i].v1 = a[i].v + v[j];
a[i].num++;
}
else if (a[i].num == 1)
{
a[i].val2 = a[i].val1 + pp[j] * v[j];
a[i].v2 = a[i].v1 + v[j];
a[i].val11 = a[i].val + pp[j] * v[j];
a[i].v11 = a[i].v + v[j];
a[i].num++;
}
}
}
}
for (int i = 1;i <= p;i++)
{
for (int j = 0;j <= n;j++)
{
f[i][j] = f[i - 1][j];
if (j >= a[i].v2)
{
f[i][j] = max(f[i - 1][j],max(f[i - 1][j - a[i].v] + a[i].val,max(f[i - 1][j - a[i].v1] + a[i].val1,max(f[i - 1][j - a[i].v11] + a[i].val11,f[i - 1][j - a[i].v2] + a[i].val2))));
}
else if (j >= a[i].v1 && j <= a[i].v11)
{
f[i][j] = max(f[i - 1][j],f[i - 1][j - a[i].v1] + a[i].val1);
}
else if (j >= a[i].v11 && j <= a[i].v1)
{
f[i][j] = max(f[i - 1][j],f[i - 1][j - a[i].v11] + a[i].val11);
}
else if (j >= a[i].v1 && j >= a[i].v11)
{
f[i][j] = max(f[i - 1][j],max(f[i - 1][j - a[i].v1] + a[i].val1,f[i - 1][j - a[i].v11] + a[i].val11));
}
}
}
cout << f[p][n];
return 0;
}
非常优秀地分类讨论力 过了样例,有的测试点会算出更大的值
我的码风需要改进吗?