#include <iostream>
#include <fstream>
#define nmax 5005
#define maxg 10005
using namespace std;
ifstream f("rucsac.in");
ofstream g("rucsac.out");
int n, G;
int w[nmax], p[nmax];
int dp[2][maxg];
void citire()
{
f>>n>>G;
for(int i=1; i<=n; ++i)
{
f>>w[i]>>p[i];
}
}
void dynamic_programming()
{
int l=0;
for(int i=1; i<=n; ++i, l=1-l)
{
for(int j=0; j<=G; ++j)
{
dp[1-l][j]=dp[l][j];
if(w[i]<=j)
{
dp[1-l][j]=max(dp[1-l][j], dp[l][j-w[i]]+p[i]);
}
}
}
g<<dp[l][G];
}
int main()
{
citire();
dynamic_programming();
return 0;
}