#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long int llint; typedef long double lldo; #define mp make_pair #define mt make_tuple #define pub push_back #define puf push_front #define pob pop_back #define pof pop_front #define fir first #define sec second #define res resize #define ins insert #define era erase //ios::sync_with_stdio(false); //std::cin.tie(0); //<< setprecision(20) const int mod=1e9+7; const llint big=1e15+100; const long double pai=3.141592653589793238462643383279502884197; const long double ena=2.71828182845904523536; const long double eps=1e-7; template void mineq(T& a,U b){if(a>b){a=b;}} template void maxeq(T& a,U b){if(a void soun(T& ar) {sort(ar.begin(),ar.end());ar.erase(unique(ar.begin(),ar.end()),ar.end());} llint gcd(llint a,llint b){if(a%b==0){return b;}else return gcd(b,a%b);} llint lcm(llint a,llint b){return a/gcd(a,b)*b;} int main(void){ //けっこんおめでとう llint i,j,n,w;cin>>n>>w; vector>nap(n); for(auto &it:nap){ cin>>get<1>(it)>>get<2>(it); get<0>(it)=((lldo)get<1>(it))/get<2>(it); } //より良いほうから選ぶと早い説 sort(nap.rbegin(),nap.rend()); vector>ans;//価値,重さ ans.pub(mp(0LL,0LL)); for(auto ait:nap){ pair it=mp(get<1>(ait),get<2>(ait)); vector>gen; gen.reserve(ans.size()*2); for(auto ima:ans){ gen.pub(ima); if(ima.sec+it.sec<=w){gen.pub(mp(ima.fir+it.fir,ima.sec+it.sec));} } ans.clear(); sort(gen.rbegin(),gen.rend());//価値のたかい順 llint omo=w+111; for(auto ir:gen){if(omo>ir.sec){ans.pub(ir);omo=ir.sec;}} } llint ret=0; for(auto it:ans){maxeq(ret,it.fir);} cout<