#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
template<typename T>
void maximize(T& a, const T& b) {
if (a < b) a = b;
}
const int INF = 1e9;
const ll LINF = 1e18;
// dp knapsack
// Bài toán gốc:
// Cho n món vật và một balo có khối lượng là S, mỗi món vật có 2 tham số là:
// w(i): khối lượng của món vật thứ i
// v(i): giá trị của món vật thứ i
// Yêu cầu chọn ra một số món vật sao cho tổng khối lượng w(i) không vượt quá S và tổng giá trị v(i) là lớn nhất?
const int N = 1e2 + 5;
const int S = 1e5 + 5;
int n, s;
int w[N], v[N];
ll ans;
void backtrack(int i, ll sum_w, ll sum_v) { // O(2^n)
if (i == n + 1) {
ans = max(ans, sum_v);
return;
}
// Bỏ qua món vật thứ i
backtrack(i + 1, sum_w, sum_v);
// Chọn món vật thứ i
if (sum_w + w[i] <= S) {
backtrack(i + 1, sum_w + w[i], sum_v + v[i]);
}
}
ll dp[N][S]; // dp[i][j] = tổng giá trị v(i) lớn nhất
// khi xét i món vật đầu tiên với tổng khối lượng w(i) của các món vật đã chọn là j
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> s;
for (int i = 1; i <= n; i++) {
cin >> w[i] >> v[i];
}
// ans = -LINF;
// backtrack(1, 0, 0);
// cout << ans << '\n';
for (int i = 0; i <= n; i++) {
for (int j = 0; j <= s; j++) dp[i][j] = -LINF;
}
dp[0][0] = 0;
for (int i = 1; i <= n; i++) {
for (int j = 0; j <= s; j++) {
// Bỏ qua món vật thứ i
maximize(dp[i][j], dp[i - 1][j]);
// Chọn món vật thứ i
if (j >= w[i]) maximize(dp[i][j], dp[i - 1][j - w[i]] + v[i]);
}
} // O(N * S)
ll ans = 0;
for (int j = 0; j <= s; j++) {
maximize(ans, dp[n][j]);
}
cout << ans << '\n';
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOyAgCgp0eXBlZGVmIGxvbmcgbG9uZyBsbDsgIAp0eXBlZGVmIHBhaXI8aW50LCBpbnQ+IGlpOyAgCgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgp2b2lkIG1heGltaXplKFQmIGEsIGNvbnN0IFQmIGIpIHsKCWlmIChhIDwgYikgYSA9IGI7IAp9Cgpjb25zdCBpbnQgSU5GID0gMWU5OyAgCmNvbnN0IGxsIExJTkYgPSAxZTE4OyAgCgovLyBkcCBrbmFwc2FjayAKLy8gQsOgaSB0b8OhbiBn4buRYzogCi8vIENobyBuIG3Ds24gduG6rXQgdsOgIG3hu5l0IGJhbG8gY8OzIGto4buRaSBsxrDhu6NuZyBsw6AgUywgbeG7l2kgbcOzbiB24bqtdCBjw7MgMiB0aGFtIHPhu5EgbMOgOiAgIAovLyB3KGkpOiBraOG7kWkgbMaw4bujbmcgY+G7p2EgbcOzbiB24bqtdCB0aOG7qSBpICAgCi8vIHYoaSk6IGdpw6EgdHLhu4sgY+G7p2EgbcOzbiB24bqtdCB0aOG7qSBpICAgCi8vIFnDqnUgY+G6p3UgY2jhu41uIHJhIG3hu5l0IHPhu5EgbcOzbiB24bqtdCBzYW8gY2hvIHThu5VuZyBraOG7kWkgbMaw4bujbmcgdyhpKSBraMO0bmcgdsaw4bujdCBxdcOhIFMgdsOgIHThu5VuZyBnacOhIHRy4buLIHYoaSkgbMOgIGzhu5tuIG5o4bqldD8KCmNvbnN0IGludCBOID0gMWUyICsgNTsgCmNvbnN0IGludCBTID0gMWU1ICsgNTsgICAgCgppbnQgbiwgczsgIAppbnQgd1tOXSwgdltOXTsgIAoKbGwgYW5zOyAgIAp2b2lkIGJhY2t0cmFjayhpbnQgaSwgbGwgc3VtX3csIGxsIHN1bV92KSB7IC8vIE8oMl5uKQoJaWYgKGkgPT0gbiArIDEpIHsKCQlhbnMgPSBtYXgoYW5zLCBzdW1fdik7ICAKCQlyZXR1cm47IAoJfQoKCS8vIELhu48gcXVhIG3Ds24gduG6rXQgdGjhu6kgaSAgIAoJYmFja3RyYWNrKGkgKyAxLCBzdW1fdywgc3VtX3YpOyAgCgoJLy8gQ2jhu41uIG3Ds24gduG6rXQgdGjhu6kgaSAKCWlmIChzdW1fdyArIHdbaV0gPD0gUykgewoJCWJhY2t0cmFjayhpICsgMSwgc3VtX3cgKyB3W2ldLCBzdW1fdiArIHZbaV0pOyAKCX0KfQoKbGwgZHBbTl1bU107IC8vIGRwW2ldW2pdID0gdOG7lW5nIGdpw6EgdHLhu4sgdihpKSBs4bubbiBuaOG6pXQKICAJCQkgLy8gCQkgICBraGkgeMOpdCBpIG3Ds24gduG6rXQgxJHhuqd1IHRpw6puIHbhu5tpIHThu5VuZyBraOG7kWkgbMaw4bujbmcgdyhpKSBj4bunYSBjw6FjIG3Ds24gduG6rXQgxJHDoyBjaOG7jW4gbMOgIGogCgppbnQgbWFpbigpIHsKCWlvczo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsgCgljaW4udGllKG51bGxwdHIpOyAgCQoJY2luID4+IG4gPj4gczsgIAoJZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSB7CgkJY2luID4+IHdbaV0gPj4gdltpXTsgCgl9IAoKCS8vIGFucyA9IC1MSU5GOyAgCgkvLyBiYWNrdHJhY2soMSwgMCwgMCk7IAoJLy8gY291dCA8PCBhbnMgPDwgJ1xuJzsgCgoJZm9yIChpbnQgaSA9IDA7IGkgPD0gbjsgaSsrKSB7CgkJZm9yIChpbnQgaiA9IDA7IGogPD0gczsgaisrKSBkcFtpXVtqXSA9IC1MSU5GOyAKCX0KCWRwWzBdWzBdID0gMDsgICAKCglmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspIHsKCQlmb3IgKGludCBqID0gMDsgaiA8PSBzOyBqKyspIHsKCQkJLy8gQuG7jyBxdWEgbcOzbiB24bqtdCB0aOG7qSBpIAoJCQltYXhpbWl6ZShkcFtpXVtqXSwgZHBbaSAtIDFdW2pdKTsKCQkJLy8gQ2jhu41uIG3Ds24gduG6rXQgdGjhu6kgaSAKCQkJaWYgKGogPj0gd1tpXSkgbWF4aW1pemUoZHBbaV1bal0sIGRwW2kgLSAxXVtqIC0gd1tpXV0gKyB2W2ldKTsKCQl9Cgl9IC8vIE8oTiAqIFMpCgoJbGwgYW5zID0gMDsgICAKCWZvciAoaW50IGogPSAwOyBqIDw9IHM7IGorKykgewoJCW1heGltaXplKGFucywgZHBbbl1bal0pOyAKCX0KCgljb3V0IDw8IGFucyA8PCAnXG4nOyAKfQ==