main.cc 641 B

1234567891011121314151617181920212223
  1. #include <cstdio>
  2. #include <cstring>
  3. #define MAX(x, y) ((x) > (y) ? (x) : (y))
  4. using namespace std;
  5. const int N = 3402, M = 12880;
  6. int W[N], D[N], dp[M + 1];
  7. int main() {
  8. int n, m;
  9. scanf("%d %d", &n, &m);
  10. for (int i = 0; i < n; i++) scanf("%d %d", &W[i], &D[i]);
  11. // dp[i][j] means the max rating under weight j from former i objects.
  12. // dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - W[i - 1]] + D[i - 1])
  13. for (int i = 0; i <= m; i++) dp[i] = W[0] <= i ? D[0] : 0;
  14. for (int i = 2; i <= n; i++)
  15. for (int j = m; 0 < j; j--)
  16. if (W[i - 1] <= j) dp[j] = MAX(dp[j], dp[j - W[i - 1]] + D[i - 1]);
  17. printf("%d\n", dp[m]);
  18. }