标签:lse 为什么 lin read 直接 答案 pre ble href
int n,W,w[300],t[300];
double eps=1e-8,v[300],f[1005];
//因为是实数二分,随便设置了个精度eps
bool check(double mid){
for(int i=1;i<=W;i++)f[i]=-1e9;
//因为要求最大值,初值就设为负无穷.
for(int i=1;i<=n;i++)
v[i]=t[i]-w[i]*mid;
//每次check时根据mid更新每头奶牛的价值
for(int i=1;i<=n;i++)
for(int j=W;j>=0;j--){
if(w[i]+j>W)f[W]=max(f[W],f[j]+v[i]);
else f[w[i]+j]=max(f[w[i]+j],f[j]+v[i]);
}
//一般的01背包都是f[j]=max(f[j],f[j-w[i]+v[i])
//但因为我们选的物品总重量只有下限,没有上限,
//所以我们这里写作:如果没选这件物品,容量j就加上w[i]
//如果选了这件物品,直接总价值f[j]加上v[i]
//然后如果容量j+w[i]超过W,还是压在f[W]里面
return f[W]>=0;
//价值和>=0说明本次二分的mid合法
}
int main(){
n=read();W=read();
for(int i=1;i<=n;i++){
w[i]=read();
t[i]=read();
}
double l=0,r=1e9,mid;
while(l+eps<r){
mid=(l+r)/2.0;
if(check(mid))l=mid;
else r=mid;
}
printf("%d\n",(int)(l*1000));
//按照题目要求输出
return 0;
}
标签:lse 为什么 lin read 直接 答案 pre ble href
原文地址:https://www.cnblogs.com/PPXppx/p/10368009.html