#include <bits/stdc++.h>
#include <fstream>
using namespace std;
const char iname[] = "rucsac.in";
const char oname[] = "rucsac.out";
int main() {
ifstream in(iname);
int N, G, i, j;
in >> N >> G;
int** m = new int*[N];
for (i = 0; i < N; ++i) {
m[i] = new int[2];
}
for (i = 0; i < N; ++i) {
in >> m[i][0] >> m[i][1];
}
in.close();
vector<int> prev(G + 1);
vector<int> curr(G + 1);
for (i = m[0][0]; i <= G; ++i) {
prev[i] = m[0][1];
}
int value, new_value, w;
for (i = 1; i <= N - 1; ++i) {
for (j = 1; j <= G; ++j) {
w = m[i][0];
if (w > j) {
curr[j] = prev[j];
} else {
value = m[i][1];
new_value = value + prev[j - w];
if (new_value > prev[j]) {
curr[j] = new_value;
} else {
curr[j] = prev[j];
}
}
}
prev = curr;
}
ofstream out(oname);
out << curr[G];
out.close();
return 0;
}