#include <iostream>
#include <vector>
#include <bits/stdc++.h>
using namespace std;
long long N, W;
long long w[110], v[110];
long long dp[110][100010];
long long f(int pos, long long cur) {
if(cur > W) return -1000000000;
if(pos == N) return 0;
if(dp[pos][cur] == -1) {
long long ans = -1000000000;
//tomar
ans = max(ans, f(pos + 1, cur + w[pos]) + v[pos]);
//no tomar
ans = max(ans, f(pos + 1, cur));
dp[pos][cur] = ans;
}
return dp[pos][cur];
}
int main () {
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
cin >> N >> W;
for(int i = 0; i < N; i++)
cin >> w[i] >> v[i];
memset(dp, -1, sizeof dp);
cout << f(0, 0) << "\n";
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmxvbmcgbG9uZyBOLCBXOwoKbG9uZyBsb25nIHdbMTEwXSwgdlsxMTBdOwoKbG9uZyBsb25nIGRwWzExMF1bMTAwMDEwXTsKCmxvbmcgbG9uZyBmKGludCBwb3MsIGxvbmcgbG9uZyBjdXIpIHsKICAgIGlmKGN1ciA+IFcpIHJldHVybiAtMTAwMDAwMDAwMDsKICAgIGlmKHBvcyA9PSBOKSByZXR1cm4gMDsKICAgIGlmKGRwW3Bvc11bY3VyXSA9PSAtMSkgeyAgCiAgICAgICAgbG9uZyBsb25nIGFucyA9IC0xMDAwMDAwMDAwOwogICAgICAgIC8vdG9tYXIKICAgICAgICBhbnMgPSBtYXgoYW5zLCBmKHBvcyArIDEsIGN1ciArIHdbcG9zXSkgKyB2W3Bvc10pOwogICAgICAgIC8vbm8gdG9tYXIKICAgICAgICBhbnMgPSBtYXgoYW5zLCBmKHBvcyArIDEsIGN1cikpOwogICAgICAgIGRwW3Bvc11bY3VyXSA9IGFuczsKICAgIH0KICAgIAogICAgcmV0dXJuIGRwW3Bvc11bY3VyXTsKfQoKaW50IG1haW4gKCkgewogICAgI2lmbmRlZiBPTkxJTkVfSlVER0UKICAgICAgICBmcmVvcGVuKCJpbnB1dC50eHQiLCAiciIsIHN0ZGluKTsKICAgICAgICBmcmVvcGVuKCJvdXRwdXQudHh0IiwgInciLCBzdGRvdXQpOwogICAgI2VuZGlmCiAgICBjaW4gPj4gTiA+PiBXOwogICAgZm9yKGludCBpID0gMDsgaSA8IE47IGkrKykKICAgICAgICBjaW4gPj4gd1tpXSA+PiB2W2ldOwogICAgbWVtc2V0KGRwLCAtMSwgc2l6ZW9mIGRwKTsKICAgIGNvdXQgPDwgZigwLCAwKSA8PCAiXG4iOwoKICAgIHJldHVybiAwOwp9