#include <iostream>
#include <algorithm>
#include <memory.h>
using namespace std;
#define N 505
#define M 100005
int need[N],value[N];
int dp[M];
int main()
{
int n,m;
cin>>n>>m;
memset(dp,0,sizeof(dp));
for(int i=0;i<n;++i)
{
cin>>need[i]>>value[i];
}
for(int i=0;i<=m;++i)
dp[i] == 0;
for(int i=0;i<n;++i)
for(int j = m;j>=need[i];--j){
dp[j] = max(dp[j],dp[j-need[i]]+value[i]);
}
cout<<dp[m]<<endl;
return 0;
}
#include <algorithm>
#include <memory.h>
using namespace std;
#define N 505
#define M 100005
int need[N],value[N];
int dp[M];
int main()
{
int n,m;
cin>>n>>m;
memset(dp,0,sizeof(dp));
for(int i=0;i<n;++i)
{
cin>>need[i]>>value[i];
}
for(int i=0;i<=m;++i)
dp[i] == 0;
for(int i=0;i<n;++i)
for(int j = m;j>=need[i];--j){
dp[j] = max(dp[j],dp[j-need[i]]+value[i]);
}
cout<<dp[m]<<endl;
return 0;
}