#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstring>
using namespace std;
long long n,w,l,r,f[100001];
struct cow
{
long long w,t;
}a[251];
bool check(long long x)
{
memset(f,-0x3f,sizeof f);
f[0]=0;
for(long long i=1;i<=n;++i)
{
long long value=a[i].t-x*a[i].w;
for(long long j=w<<1;j>=a[i].w;--j)
f[j]=max(f[j],f[j-a[i].w]+value);
}
for(long long j=w<<1;j>=w;--j)
f[w]=max(f[w],f[j]);
return f[w]<=0;
}
signed main()
{
scanf("%lld%lld",&n,&w);
for(long long i=1;i<=n;r+=a[i].t*=1000,++i)
scanf("%lld%lld",&a[i].w,&a[i].t);
while(l<=r)
{
long long mid=(l+r)>>1;
if(check(mid))
r=mid-1;
else l=mid+1;
}
printf("%lld",r);
return 0;
}
//sum(t[i])/sum(w[i])<=ans
//ans*sum(w[i])>=sum(t[i])
//sum(t[i]-ans*w[i])<=0
这当中的二分为何边界是这样……
若写成如下形式,为何最后答案会多 1……
while(l<r)
{
long long mid=(l+r)>>1;
if(check(mid))
r=mid;
else l=mid+1;
}