/*基础dp*/
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#define maxx 100000+10
using namespace std;
struct node{
int weight, value;
}NN[maxx];
int dp[maxx];
int main()
{
int n, m;
while(scanf("%d%d", &n ,&m) != EOF){
memset(dp, 0, sizeof(dp));
for(int i = 0; i < n; i++){
scanf("%d%d", &NN[i].weight, &NN[i].value);
}
for(int i = 0; i < n; i++){
for(int j = m; j >= NN[i].weight; j--){ //m为包的最大体积
dp[j] = max(dp[j], dp[j - NN[i].weight] + NN[i].value);
}
}
printf("%d\n", dp[m]);
}
return 0;
}