1 条题解
-
0
如何表示状态?
dp[j] 前i只奶牛用for完成。状态转移方程?
dp[j] = max(dp[j], dp[j−s[i]] + f[i])初始状态?
memset(dp, −0x3f, sizeof(dp)); 负无穷 dp[400000] = 0;代码
#include<bits/stdc++.h> using namespace std; int n; int s[405], f[405]; int dp[400005]; const int MR = 100000; int main() { memset(dp, -0x3f, sizeof(dp)); cin >> n; for (int i = 1; i <= n; i++) { cin >> s[i] >> f[i]; } dp[MR] = 0; for (int i = 1; i <= n; i++) { if (s[i] >= 0) { for (int j = 2 * MR; j >= s[i]; j--) { dp[j] = max(dp[j], dp[j - s[i]] + f[i]); } } else { for (int j = 0; j <= 2 * MR + s[i]; j++) { dp[j] = max(dp[j], dp[j - s[i]] + f[i]); } } } int ans = 0; for (int i = MR; i <= 2 * MR; i++) if (dp[i] >= 0) ans = max(ans, i + dp[i] - MR); cout << ans << endl; return 0; }
- 1
信息
- ID
- 2197
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 10
- 标签
- 递交数
- 7
- 已通过
- 2
- 上传者