The ans:
```cpp
#include <bits/stdc++.h>
using namespace std;
struct node
{
int zv, zp;
int fv1, fp1;
int fv2, fp2;
} a[100];
int maxn, n;
int dp[35000];
int main()
{
std::ios::basic_ios::ios_base::sync_with_stdio(0);
cin >> maxn >> n;
int v, p, q;
for (int i = 1; i <= n; i++)
{
cin >> v >> p >> q;
if (q == 0)
{
a[i].zv = v;
a[i].zp = v * p;
}
else
{
if (a[q].fp1 == 0)
{
a[q].fv1 = v;
a[q].fp1 = v * p;
}
else
{
a[q].fv2 = v;
a[q].fp2 = v * p;
}
}
}
for (int i = 1; i <= n; i++)
{
if (a[i].zp == 0)
continue;
for (int j = maxn; j >= a[i].zv; j--)
{
dp[j] = max(dp[j], dp[j - a[i].zv] + a[i].zp);
if (a[i].zv + a[i].fv1 <= j)
dp[j] = max(dp[j], dp[j - a[i].zv - a[i].fv1] + a[i].zp + a[i].fp1);
if (a[i].zv + a[i].fv2 <= j)
dp[j] = max(dp[j], dp[j - a[i].zv - a[i].fv2] + a[i].zp + a[i].fp2);
if (a[i].zv + a[i].fv1 + a[i].fv2 <= j)
dp[j] = max(dp[j], dp[j - a[i].zv - a[i].fv1 - a[i].fv2] + a[i].zp + a[i].fp1 + a[i].fp2);
}
}
cout << dp[maxn];
return 0;
}
```
by Enoch2013 @ 2024-04-08 19:37:21
你动归的方法错了,看一下我的代码就知道了。
by Enoch2013 @ 2024-04-08 19:40:09
@[Enoch2013](/user/1069719)
饿还是没看出啥,不过你的maxn好像是我的n,你的n是我的m
by CtrlEEE @ 2024-04-10 18:36:08
@[CtrlEEE](/user/938852) YES
by Enoch2013 @ 2024-04-11 20:45:33
来的可能有点迟,这个问题我做的时候也遇到了。你可以把`count`去掉,用每次判断一下是不是主件,然后就过了。
~~也不知道怎么回事~~
by MinLand @ 2024-04-17 13:38:01