1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| #include<iostream> #include<cstring> #include<algorithm> using namespace std;
int n, m, w[1005], v[1005];
int dp[1005][1005], mx[1005][1005]; int main() { cin >> n >> m; for (int i = 1; i <= n; i++) cin >> w[i] >> v[i]; memset(dp, -1, sizeof(dp)); memset(mx, 0, sizeof(mx)); dp[0][0] = 0, mx[0][0] = 0; for (int i = 1; i <= n; i++){ for (int j = 0; j <= m; j++){ if (j >= w[i] && dp[i - 1][j - w[i]] != -1) dp[i][j] = max(dp[i][j], dp[i - 1][j - w[i]] + v[i]); if (dp[i - 1][j] != -1) dp[i][j] = max(dp[i][j], dp[i - 1][j]); if (j >= w[i] && dp[i - 1][j - w[i]] != -1 && dp[i][j] == dp[i - 1][j - w[i]] + v[i]) mx[i][j] = max(mx[i][j], max(mx[i - 1][j - w[i]], w[i])); if (dp[i - 1][j] != -1 && dp[i][j] == dp[i - 1][j]) mx[i][j] = max(mx[i][j], mx[i - 1][j]); } } int ans = 0; for (int j = 0; j <= m; j++) ans = max(ans, dp[n][j]); int ans2 = 0; for (int j = 0; j <= m; j++) if (dp[n][j] == ans) ans2 = max(ans2, mx[n][j]); cout << ans2 << endl; return 0; }
|