#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1000, V = 1001;
// 0-based
// int f[N][V]; // v[N], w[N];
// int knapsack(int v[], int w[], int n, int m) {
// if (v[0] <= m) {
// f[0][v[0]] = w[0];
// }
// for (int i = 1; i < n; i++) {
// for (int j = 0; j <= V; j++) {
// f[i][j] = f[i - 1][j];
// if (j >= v[i]) {
// f[i][j] = max(f[i][j], f[i - 1][j - v[i]] + w[i]);
// }
// }
// }
// return *max_element(f[n - 1], f[n - 1] + m + 1);
// }
// // **********************************************************
// int f[N][V]; // v[N], w[N];
// int knapsack(int v[], int w[], int n, int m) {
// for (int j = v[0]; j <= m; j++) {
// f[0][j] = w[0];
// }
// for (int i = 1; i < n; i++) {
// for (int j = 0; j <= m; j++) {
// f[i][j] = f[i - 1][j];
// if (j >= v[i]) {
// f[i][j] = max(f[i][j], f[i - 1][j - v[i]] + w[i]);
// }
// }
// }
// return f[n - 1][m]; // *(f[n - 1] + m);
// }
// // **********************************************************
// int f[N + 1][V];
// int knapsack(int v[], int w[], int n, int m) {
// // f[0] = {0, ..., 0};
// for (int i = 1; i <= n; i++) {
// for (int j = 0; j <= m; j++) {
// f[i][j] = f[i - 1][j];
// if (j >= v[i - 1]) {
// f[i][j] = max(f[i][j], f[i - 1][j - v[i - 1]] + w[i - 1]);
// }
// }
// }
// return f[n][m];
// }
// // **********************************************************
// final version
const int N = 1000, V = 1001;
int f[V]; // v[N], w[N];
int knapsack(int v[], int w[], int n, int m) {
for (int i = 0; i < n; i++) { // n times
for (int j = m; j >= v[i]; j--) {
f[j] = max(f[j], f[j - v[i]] + w[i]);
}
}
return f[m];
}
// // **********************************************************
// // 1-based
// int f[N + 1][V]; // v[N], w[N];
// int knapsack(int v[], int w[], int n, int m) {
// for (int i = 1; i <= n; i++) {
// for (int j = 0; j <= m; j++) {
// f[i][j] = f[i - 1][j];
// if (j >= v[i]) {
// f[i][j] = max(f[i][j], f[i - 1][j - v[i]] + w[i]);
// }
// }
// }
// return f[n][m];
// }
// // **********************************************************
// int f[V];
// int knapsack(int v[], int w[], int n, int m) {
// for (int i = 1; i <= n; i++) { // n times
// for (int j = m; j >= v[i]; j--) {
// f[j] = max(f[j], f[j - v[i]] + w[i]);
// }
// }
// return f[m];
// }
int main() {
int n, m;
int v[N], w[N];
cin >> n >> m;
for (int i = 0 ;i <= n; i++) {
// for (int i = 1 ;i <= n; i++) {
cin >> v[i] >> w[i];
}
cout << knapsack(v, w, n, m);
return 0;
}