// #include<iostream>
// #include<algorithm>
// using namespace std;
// const int N = 1010;
// int n,m; // n:物品个数 m:背包容量
// int v[N],w[N]; // v:体积 w:价值
// int f[N][N];// f[i][j]表示前i个物品放入容量为j的背包的最大价值
// int main()
// {
// cin>>n>>m;
// for(int i=1;i<=n;i++) cin>>v[i]>>w[i]; // 输入物品的体积和价值
// for(int i=1;i<=n;i++){// 枚举物品
// for(int j=1;j<=m;j++){ // 枚举背包容量
// if(j<v[i]) f[i][j]=f[i-1][j];// 如果第i个物品的体积大于背包容量,那么第i个物品不能放入背包
// else {
// f[i][j]=max(f[i-1][j],f[i-1][j-v[i]]+w[i]);// 否则,第i个物品可以放入背包,取放入和不放入的最大值
// }
// }
// }
// cout<<f[n][m]<<endl;// 输出最大价值
// return 0;
// }
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
const int N = 1010;
int n,m;
int v[N],w[N];// v:体积 w:价值
int f[N];// f[i]表示容量为i的背包的最大价值
int main()
{
cin>>n>>m;// 输入物品个数和背包容量
for(int i=1;i<=n;i++) cin>>v[i]>>w[i];// 输入物品的体积和价值
for(int i=1;i<=n;i++){// 枚举物品
for(int j=m;j>=v[i];j--){// 枚举背包容量
f[j]=max(f[j],f[j-v[i]]+w[i]);// f[j]表示容量为j的背包的最大价值
}
}
cout<<f[m]<<endl;// 输出最大价值
return 0;
}