#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 10;
ll N, V, MAX;
struct Data {
ll val, vol;
bool operator < (const Data &atr) const {
return 1.0*val/vol > 1.0*atr.val/atr.vol;
}
}data[maxn];
void dfs(int x, ll val, int vol) {
if (x == N - 1 || vol == 0) { MAX = max(MAX, val); return; }
if (val + data[x].val*(vol/data[x].vol+1) <= MAX) return;
dfs(x+1, val, vol);
if (data[x].vol <= vol) dfs(x+1, val+data[x].val, vol-data[x].vol);
}
int main() {
while (~scanf("%lld%lld", &N, &V)) {
for (int i = 1; i <= N; i++) scanf("%lld%lld", &data[i].vol, &data[i].val);
sort(data+1, data+1+N);
MAX = 0;
dfs(1, 0, V);
printf("%lld\n", MAX);
}
return 0;
}