#include<bits/stdc++.h>
using namespace std;
int f[1005][1005],n,m,v[1005],w[1005]; //f[i][j]表示前i个物品用j点空间能装的最大价值
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>w[i]>>v[i];
//读入
for(int i=1;i<=n;i++)
{
for(int j=0;j<=m;j++)
{
f[i][j]=f[i-1][j];//不选
if(j>=w[i]) f[i][j]=max(f[i][j],f[i-1][j-w[i]]+v[i]); //可以选则判断是选还是不选
}
}
int res=0;
for(int i=0;i<=m;i++)
res=max(f[n][i],res);
//求解
cout<<res;
return 0;
}