#include <fstream>
using namespace std;
ifstream f("rucsac.in");
ofstream g("rucsac.out");
int i,n,gmax,ultim,j,ii,maxi;
int sortat,pr[5005],gr[5005];
int pret[2800000];
int main()
{
f>>n>>gmax;
for(i=1;i<=n;i++)
{
f>>gr[i]>>pr[i];
}
while(!sortat)
{
sortat=1;
for(i=1;i<n;i++)
if(gr[i]>gr[i+1]){swap(gr[i],gr[i+1]);swap(pr[i],pr[i+1]);sortat=0;}
else if(gr[i]==gr[i+1] && pr[i]>pr[i+1]){swap (pr[i],pr[i+1]);sortat=0;}
}
pret[gr[1]]=pr[1];
ultim=gr[1];
for(i=2;i<=n;i++)
{
for(j=ultim;j>=1;j--)
if(pret[j]) pret[j+gr[i]] = max(pret[j+gr[i]],pret[j]+pr[i]);
pret[gr[i]]= max(pret[gr[i]],pr[i]);
ultim=ultim+gr[i];
}
for(i=1;i<=gmax;i++)
if(pret[i]>maxi)maxi=pret[i];
g<<maxi<<'\n';
return 0;
}