#include<bits/stdc++.h>
using namespace std;
#define MAX_N 100
#define MAX_W 1000
int cnt=0;
int n;
int dp[MAX_W+1];
int weight[MAX_N+1];
int cost[MAX_N+1];
int CAP;
int func(int i,int w)
{
cnt++;
if(i==n+1) return 0;
if(dp[w]!=-1) return dp[w];
int profit1=0,profit2=0;
if(w+weight[i]<=CAP)
profit1=cost[i]+func(i+1,w+weight[i]);
profit2=func(i+1,w);
dp[w]=max(profit1,profit2);
return dp[w];
}
int main()
{
memset(dp,-1,sizeof(dp));
int i,j,k,l;
scanf("%d %d",&n,&CAP);
for(i=1;i<=n;i++)
{
scanf("%d %d",&weight[i],&cost[i]);
}
printf("%d",func(1,0));
}
//4 6
//4 5
//3 5
//1 5
//3 6
//answer: 11
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgojZGVmaW5lIE1BWF9OIDEwMAojZGVmaW5lIE1BWF9XIDEwMDAKaW50IGNudD0wOwoKaW50IG47CmludCBkcFtNQVhfVysxXTsKaW50IHdlaWdodFtNQVhfTisxXTsKaW50IGNvc3RbTUFYX04rMV07CmludCBDQVA7CmludCBmdW5jKGludCBpLGludCB3KQp7CgljbnQrKzsKCWlmKGk9PW4rMSkgcmV0dXJuIDA7CglpZihkcFt3XSE9LTEpIHJldHVybiBkcFt3XTsKCglpbnQgcHJvZml0MT0wLHByb2ZpdDI9MDsKCWlmKHcrd2VpZ2h0W2ldPD1DQVApCgkJcHJvZml0MT1jb3N0W2ldK2Z1bmMoaSsxLHcrd2VpZ2h0W2ldKTsKCglwcm9maXQyPWZ1bmMoaSsxLHcpOwoKCWRwW3ddPW1heChwcm9maXQxLHByb2ZpdDIpOwoJcmV0dXJuIGRwW3ddOwp9CgppbnQgbWFpbigpCnsKCgltZW1zZXQoZHAsLTEsc2l6ZW9mKGRwKSk7CglpbnQgaSxqLGssbDsKCXNjYW5mKCIlZCAlZCIsJm4sJkNBUCk7Cglmb3IoaT0xO2k8PW47aSsrKQoJewoJCXNjYW5mKCIlZCAlZCIsJndlaWdodFtpXSwmY29zdFtpXSk7Cgl9CgoJcHJpbnRmKCIlZCIsZnVuYygxLDApKTsKCn0KCi8vNCA2Ci8vNCA1Ci8vMyA1Ci8vMSA1Ci8vMyA2Ci8vYW5zd2VyOiAxMQo=