本题共有两个转移方程:
为什么先对第一个方程操作、再对第二个方程操作可以 AC,而反过来却不行呢?
即 ACCode:
#include <stdio.h>
#pragma warning (disable : 4996)
#define maxn 2005
#define LL long long
LL n, x;
LL lose[maxn], win[maxn], use[maxn], dp[maxn];
LL max(LL a, LL b) { return a > b ? a : b; }
int main() {
scanf("%lld%lld", &n, &x);
for (int i = 1; i <= n; i++)
scanf("%lld%lld%lld", &lose[i], &win[i], &use[i]);
for (int i = 1; i <= n; i++) {
for (int j = x; j >= use[i]; j--)
dp[j] = max(dp[j] + lose[i], dp[j - use[i]] + win[i]);
for (int j = use[i] - 1; j >= 0; j--)
dp[j] = dp[j] + lose[i];
}
printf("%lld", dp[x] * 5);
return 0;
}
而 WACode:
#include <stdio.h>
#pragma warning (disable : 4996)
#define maxn 2005
#define LL long long
LL n, x;
LL lose[maxn], win[maxn], use[maxn], dp[maxn];
LL max(LL a, LL b) { return a > b ? a : b; }
int main() {
scanf("%lld%lld", &n, &x);
for (int i = 1; i <= n; i++)
scanf("%lld%lld%lld", &lose[i], &win[i], &use[i]);
for (int i = 1; i <= n; i++) {
for (int j = use[i] - 1; j >= 0; j--)
dp[j] = dp[j] + lose[i];
for (int j = x; j >= use[i]; j--)
dp[j] = max(dp[j] + lose[i], dp[j - use[i]] + win[i]);
}
printf("%lld", dp[x] * 5);
return 0;
}
两个循环为什么不能更换位置呢?