01
#include<bits/stdc++.h>
using namespace std;
int bestp;
int cv;
int cw;
int n;
int c;
struct obj{
int w;//重量
int v;//价值
};
obj *s;
int bond(int i){
int cleft=c-cw;
int b=cv;
while(i<n&&s[i].w<=cleft){
cleft-=s[i].w;
b+=s[i].v;
i++;
}
if(i<=n)
{
b+=s[i].v*cleft/s[i].w;
}
return b;
}
bool cmp(obj a,obj b){
double a1=float(a.v)/a.w;
double b1=float(b.v)/b.w;
return a1>b1;
}
void backtrack(int t){
if(t>n){
if(cv>bestp)
bestp=cv;
}
else{
if(cw+s[t].w<=c)
{
cw+=s[t].w;
cv+=s[t].v;
backtrack(t+1);
cv-=s[t].v;
cw-=s[t].w;
}
}
if(bond(t+1)>bestp)
backtrack(t+1);
}
int main(){
cin>>n>>c;
s=new obj[1000];
for(int i=1;i<=n;i++){
cin>>s[i].w>>s[i].v;
}
sort(s+1,s+n+1,cmp);
backtrack(1);
cout<<bestp;
return 0;
}
/*
#include<bits/stdc++.h>
using namespace std;
int main(){
int w[102];
int v[102];
int m[1002][1002];
memset(m,0,sizeof(m));
int n;
int c;
cin>>n;
cin>>c;
for(int i=1;i<=n;i++){
cin>>w[i];
cin>>v[i];
}
int sum=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=c;j++){
if(j>=w[i])//当前这个物品重量小于当前背包重量 选择不放或者是上个不放放这次这个其中大的那个
m[i][j]=max(m[i-1][j],m[i-1][j-w[i]]+v[i]);
else//物品大于背包重量 则不放 状态转移但是 不变
m[i][j]=m[i-1][j];
if(m[i][j]>sum)
sum=m[i][j];
}
}
cout<<sum<<endl;
}
*/