zoukankan      html  css  js  c++  java
  • 01分数规划详析 (洛谷4377)

    基本题面:

    设有n组数据a,b,对于每一组数据,都有选和不选两种状态(设状态为x,选则x=1,不选则x=0),现在欲求出所有选中的数据中,∑a/∑b的最大值。

    接下来是一些数学问题:

    设原式最大值为R,R=∑(ai·xi)/∑(bi·xi)

    若设L为某一种不那么优的选法,则恒有R>=L

    则:

    ∑(ai·xi)/∑(bi·xi)>=L

    于是:

    ∑(ai·xi)>=∑(bi·xi)·L

    那么:

    ∑(ai·xi)-∑(bi·xi)·L>=0

    所以:

    ∑((ai-bi·L)·xi)>=0

    所以我们构造一个函数f(L),

    f(L)=∑((ai-bi·L)·xi)

    这时我们讨论一下函数f(L)的性质:

    根本性质一:首先,对于所有有意义的R,L,f(L)>=0,

    根本性质二:其次,设d=ai-bi·L,则d随L单调递减!

    那么我们会发现,如果L足够大,那么无论x如何取值,所得函数值均小于0!

    这就与根本性质一相矛盾

    于是我们发现,一定存在一个临界状态的L能够使得∃f(L)>=0,而使得∀f(L+1)<0!

    而且这个L满足单调性,故可以二分答案!

    同时我们会发现,其实R就是所有L中的一个值,所以求出L的最大值就是求出了L!

    对于每个L,我们仅需按贪心地求出f(L)最大值,判断其正负即可。

    对于本题,我们只需用01背包求出最大值即可。

    贴代码:

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <iostream>
    #define ll long long
    using namespace std;
    int w[255];
    int b[255];
    int n,W;
    ll f[10005];
    bool check(int z)
    {
        for(int i=1;i<=W;i++)
        {
            f[i]=-0x3f3f3f3f;
        }
        f[0]=0;
        for(int i=1;i<=n;i++)
        {
            for(int j=W;j>=0;j--)
            {
                if(f[j]!=-0x3f3f3f3f)
                {
                    int wei=j+w[i];
                    wei=min(wei,W);
                    f[wei]=max(f[wei],f[j]+b[i]-(ll)z*w[i]);
                }
            }
        }
        if(f[W]>=0)
        {
            return 1;
        }
        return 0;
    }
    int div()
    {
        int l=0;
        int r=1000000;
        int ans=0;
        while(l<=r)
        {
            int mid=(l+r)>>1;
            if(check(mid))
            {
                ans=mid;
                l=mid+1;
            }else
            {
                r=mid-1;
            }
        }
        return ans;
    }
    int main()
    {
        scanf("%d%d",&n,&W);
        for(int i=1;i<=n;i++)
        {
            scanf("%d%d",&w[i],&b[i]);
            b[i]*=1000;
        }
        printf("%d
    ",div());
        return 0;
    }
  • 相关阅读:
    Ubuntu +PHP-fpm + Nginx 访问php界面空白的界面的分析
    Erlang 语言简介
    坐标体系WGS84/GCJ02/BD09
    Linux 系统的启动顺序
    母板页 难点---数据交换
    用户控件(二)--常见4 种路径问题解决:
    XML语言:可扩展的标记语言;
    用户控件(一) ----交换信息
    单选款复选款的选择并操作方法
    生成指定格式的流水号
  • 原文地址:https://www.cnblogs.com/zhangleo/p/9670751.html
Copyright © 2011-2022 走看看