##01背包问题
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1010;
int dp[N] = {0};
struct node{
int v,w;
}a[N];
int main()
{
int n,v;
cin >> n >> v;
for (int i = 0; i < n; i ++ ) cin >> a[i].v >> a[i].w;
for (int i = 0; i < n; i ++ )
{
for (int j = v; j >= a[i].v; j -- )
{
dp[j] = max(dp[j] , dp[j - a[i].v] + a[i].w);
}
}
cout << dp[v] << endl;
return 0;
}