#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
void readingItems(vector<pair<int, int>>& items, int& N, int& G) {
ifstream fin("rucsac.in");
int W, P;
fin >> N >> G;
for (int i = 0; i < N; ++i) {
fin >> W >> P;
items.push_back(pair<int, int>(W, P));
}
}
int maxValue(vector<pair<int, int>>& items, int N, int G) {
++G;
vector<int> temp(G, 0);
for (int i = 0; i < N; ++i) {
vector<int> currentTemp(G, 0);
for (int j = 1; j < G; ++j) {
if (items[i].first > j)
currentTemp[j] = temp[j];
else
currentTemp[j] = max(temp[j], items[i].second + temp[j - items[i].first]);
}
temp = currentTemp;
}
return temp[G - 1];
}
int main() {
int N, G;
vector<pair<int, int>> items;
readingItems(items, N, G);
ofstream fout("rucsac.out");
fout << maxValue(items, N, G);
return 0;
}