#include #include #include #include #include #include #include using namespace std; struct Item { bool operator<(const Item& o) const { return (double)v * o.w < (double)o.v * w; } int64_t v, w; }; vector o; int64_t v_max; void dfs(int d, int64_t v, int64_t w) { if (d < 0 || w == 0) { v_max = max(v_max, v); return; } int d1 = d; int64_t v1 = v, w1 = w; for (; d1 >= 0; d1--) { if (w1 - o[d1].w < 0) break; v1 += o[d1].v; w1 -= o[d1].w; } if (d1 < 0 || w1 == 0) { v_max = max(v_max, v1); return; } if (v_max - v1 >= (double)o[d1].v / o[d1].w * w1) return; int64_t w2 = w - o[d].w; if (w2 >= 0) dfs(d - 1, v + o[d].v, w2); dfs(d - 1, v, w); } int main() { ios::sync_with_stdio(false); cin.tie(0); int n; cin >> n; int64_t W; cin >> W; o.resize(n); for (int i = 0; i < n; i++) { cin >> o[i].v >> o[i].w; } sort(o.begin(), o.end()); v_max = 0; dfs(n - 1, 0, W); cout << v_max << endl; return 0; }