#include using namespace std; int main() { int N; long long W; cin >> N >> W; vector v(N), w(N); for (int i = 0; i < N; ++i) { cin >> v[i] >> w[i]; } long long ans = 0; long long bestv = v[0], bestw = w[0]; long long maxw = w[0]; for (int i = 1; i < N; ++i) { if (bestv * w[i] < v[i] * bestw) { bestv = v[i]; bestw = w[i]; } if (maxw < w[i]) { maxw = w[i]; } } long long least = (W - bestw * maxw + bestw) / bestw; vector dp(bestw * maxw, 0); for (int i = 1; i < bestw * maxw; ++i) { for (int j = 0; j < N; ++j) { if (w[j] <= i && dp[i] < dp[i - w[j]] + v[j]) { dp[i] = dp[i - w[j]] + v[j]; } } } ans = least * bestv + dp[W - least * bestw]; cout << ans << endl; }