#include <fstream>
#define GMAX 10005
#define NMAX 5005
using namespace std;
ifstream fin("rucsac.in");
ofstream fout("rucsac.out");
struct obiect
{
int short w, p;
}objects[GMAX];
short int dp[NMAX][GMAX], N, G;
void citire();
void pd();
int main()
{
citire();
pd();
fout<<dp[N][G]<<'\n';
return 0;
}
void citire()
{
int i;
fin>>N>>G;
for(i=1;i<=N;++i)
{
fin>>objects[i].w>>objects[i].p;
}
}
void pd()
{
int i, j, maxim;
for(i=0;i<=N;++i)
dp[0][i]=0;
for(i=0;i<=G;++i)
dp[i][0]=0;
for(i=1;i<=N;++i)
{
for(j=1;j<=G;++j)
{
maxim=0;
if( j>=objects[i].w && dp[i-1][j-objects[i].w] + objects[i].p > dp[i-1][j] )
maxim=dp[i-1][j-objects[i].w] + objects[i].p;
else
maxim=dp[i-1][j];
dp[i][j]=maxim;
}
}
}