1 #include <cstdio>
2 #include <cctype>
3 #include <algorithm>
4 #include <cmath>
5 #include <cstring>
6 #include <utility>
7 #define number s-'0'
8
9 using namespace std;
10
11 const int MAX_N=50;
12 const long long INF=0x3fffffffffffffff;
13 int n;
14 long long w[MAX_N], v[MAX_N];
15 long long W;
16 pair<long long, long long> ps[1<<(MAX_N/2)];
17
18 void read(int &x){
19 char s;
20 x=0;
21 bool flag=0;
22 while(!isdigit(s=getchar()))
23 (s=='-')&&(flag=true);
24 for(x=number;isdigit(s=getchar());x=x*10+number);
25 (flag)&&(x=-x);
26 }
27
28 void write(int x)
29 {
30 if(x<0)
31 {
32 putchar('-');
33 x=-x;
34 }
35 if(x>9)
36 write(x/10);
37 putchar(x%10+'0');
38 }
39
40 long long max(long long x, long long y)
41 {
42 if (x>y) return x;
43 return y;
44 }
45
46 int main()
47 {
48 read(n);scanf("%I64d",&W);
49 for (int i=0; i<n; i++)
50 {
51 scanf("%I64d %I64d",&w[i], &v[i]);
52 }
53 int n2=n/2;
54 for (int i=0; i<1<<n2; i++)
55 {
56 long long sw=0, sv=0;
57 for (int j=0; j<n2; j++)
58 {
59 if (i>>j&1)
60 {
61 sw+=w[j];
62 sv+=v[j];
63 }
64 }
65 ps[i]=make_pair(sw, sv);
66 }
67 sort(ps, ps+(1<<n2));
68 int m=1;
69 for (int i=1; i<1<<n2; i++)
70 {
71 if (ps[m-1].second<ps[i].second)
72 {
73 ps[m++]=ps[i];
74 }
75 }
76 long long res=0;
77 for (int i=0; i<1<<(n-n2); i++)
78 {
79 long long sw=0, sv=0;
80 for (int j=0; j<n-n2; j++)
81 {
82 if (i>>j&1)
83 {
84 sw+=w[n2+j];
85 sv+=v[n2+j];
86 }
87 }
88 if (sw<=W)
89 {
90 long long tv=(lower_bound(ps, ps+m, make_pair(W-sw,INF))-1)->second;
91 res=max(res,sv+tv);
92 }
93 }
94 printf("%d
", res);
95 }