题解中的解法基本上都是下面这种:
sort(arr + 1, arr + 1 + n, cmp);
for (int i = 1; i <= n; i++)
for (int j = T; j >= arr[i].c; j--)
f[j] = max(f[j], f[j - arr[i].c] + arr[i].a - arr[i].b * j);
ll ans = 0;
for (int i = 0; i <= T; i++)
ans = max(ans, f[i]);
cout << ans;
考虑以下数据:
15 2
200
200
10
-10
5
5
题解做法得出的结果是 450,但正确答案应该是 500。
以下做法可以得出正确结果:
sort(arr + 1, arr + 1 + n, cmp);
for (int i = 1; i <= n; i++)
{
for (int j = T; j >= arr[i].c; j--)
f[j] = max(f[j], f[j - arr[i].c] + arr[i].a - arr[i].b * j);
for (int j = 1; j <= T; j++)
f[j] = max(f[j - 1], f[j]);
}
cout << f[T];