60pts求助

P1064 [NOIP2006 提高组] 金明的预算方案

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


|