#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cstring>
#include <string>
#include <vector>
#include <queue>
#include <deque>
#include <utility>
#include <set>
#include <map>
#include <cmath>
#include <bitset>
#define ll long long int
#define punct pair<ll,ll>
#include <cstdio>
using namespace std;
//ifstream cin(".in");
//ofstream cout(".out");
//ios_base::sync_with_stdio(false);
ifstream f("rucsac.in");
ofstream g("rucsac.out");
FILE*fin=fopen("rucsac.in","r");
FILE*fout=fopen("rucsac.out","w");
int i,a,dif1,dif2,b,x,y,n,M,k,maxi,N,rasp,kk,sum,S,smax,P,ix,iy,ii,T,l,w,p;
int j;
int DX[]={-1,-1,-1,0,0,1,1,1};
int DY[]={1,0,-1,1,-1,1,0,-1};
void Fill(short int x,short int y)
{
// for (int k=0;k<8;++k)
// if (m[x+DX[k]][y+DY[k]])
// m[x+DX[k]][y+DY[k]]=0,Fill(x+DX[k],y+DY[k]),++T;
}
int G[10001];
int main ()
{
fscanf(fin,"%d%d",&N,&M);
/*for (i=2;i<=2000;++i)
if (!ch[i])
for (j=i*i;j<=2000;j+=i)
ch[j]=1;
for (i=1;i<=2000;++i)
if (!ch[i])
prime[++k]=i;*/
for (i=1;i<=N;++i)
{
fscanf(fin,"%d%d",&w,&p);
for (j=M-w;j>=0;--j)
if (G[j+w]<G[j]+p)
G[j+w]=G[j]+p;
}
for (i=0;i<=M;++i)
if (G[i]>maxi)
maxi=G[i];
g<<maxi;
return 0;
}