返回顶部

01分数规划

 


作者:@魔幻世界魔幻人生
本文为作者原创,转载请注明出处:https://www.cnblogs.com/subtlemaple/p/16618390.html


01分数规划

经典例题:POJ2976

给定 n 个物品的价值 a 和 花费 b ,取其中的 k 个物品,求 a[i]/b[i] 的最大值。

题解

假设 a[i]/b[i]=x ,则:

x 不是最优解时,a[i]/b[i]x 成立,则存在一种组合使 (a[i]x×b[i])>0 成立

为了尽可能让解更大,我们需要尽可能使该式成立,这样就可以继续找更大的解。

为了尽可能使该式成立,我们需要取最大的 k(a[i]x×b[i])

(a[i]x×b[i])>0 成立, x 就不是最优解 ;

也就是说不断二分 x 的值,就可以找到最优解:

cheknum=(a[i]x×b[i]) ,

cheknum>0 , 则 x 可以更大

cheknum=0 , 则 x 是最优解

cheknum<0 , 则 x 需要更小

代码:

bool chek(int x)
{
    rep(i,1,n) c[i]=a[i]-x*b[i];
    sort(c+1,c+n+1,cmp);//从大到小
    int res=0;
    rep(i,1,k) res+=c[i];
    return res >= 0;
    
}

void solv()
{
    int l=0,r=maxx;
    while(r - l > eps)
    {
        double mid = (r+l)/2;
        if(chek(mid)) l=mid;//更大
        else r=mid;//变小
    }
    printf("%lf",l);
}
posted @   魔幻世界魔幻人生  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示