#include<fstream>
using namespace std;
struct elem
{
int x,y;
};
ifstream fin("rucsac.in");
ofstream fout("rucsac.out");
const int NMAX=5005;
const int GMAX=10005;
int n,G;
elem a[NMAX];
int m1[GMAX],m2[GMAX];
inline void Citire()
{
int i;
fin>>n>>G;
for (i=1;i<=n;i++) fin>>a[i].x>>a[i].y;
}
inline void Solve()
{
int i,j;
for (i=1;i<=n;i++)
{
for (j=0;j<=G;j++)
{
m2[j]=0;
m2[j]=max(m2[j],m1[j]);
if (a[i].x<=j) m2[j]=max(m2[j],m1[j-a[i].x]+a[i].y);
}
for (j=0;j<=G;j++)
m1[j]=m2[j];
}
}
inline void Afisare()
{
int i,maxim=0;
for (i=1;i<=G;i++) maxim=max(maxim,m2[i]);
fout<<maxim<<"\n";
}
int main()
{
Citire();
Solve();
Afisare();
return 0;
}