if (k <= f[i] / d[i] + 1)
注意 d[i] 作为除数可能为 0。
if (d[i] && k <= f[i] / d[i] + 1)
不可以将 d[i]=0 的情况排除。
std::fill(dp[0], dp[0] + (maxN + 10) * (maxH * 12 + 10), -inf);
dp[0][0] = 0;
for (int i = 1; i <= n; i++) {
//printf("i = %d\n", i);
for (int j = 1; j <= H; j++) {
//printf("j = %d\n", j);
for (int k = 0; k <= j - t[i - 1]; k++) {
//printf("k = %d\n", k);
if ((k - 1) * d[i] < f[i]) {
dp[i][j] = std::max(dp[i][j], dp[i - 1][j - t[i - 1] - k] + k * f[i] - k * (k - 1) / 2 * d[i]);
//printf("dp[%d][%d] = %d\n", i, j, dp[i][j]);
ans = std::max(ans, dp[i][j]);
}
}
}
}