• 01分数规划


    基本题型

    01分数规划是这样的一类问题,有一堆物品,每一个物品有一个收益ai,一个代价bi,我们要求一个方案使选择的

    [sum_{} a[i] / sum_{} b[i] ]

    最大(或最小)

    分析

    以最大为例,设x为最大值即x = Σai/Σbi,就有x * Σbi = Σai ---> Σai - x * Σbi = 0;
    仔细分析,枚举可以被二分替代:x大了上式小于0,小了则大于0;

    inline void solve(double x){
    	for(rint i=1;i<=n;i++) d[i]=a[i]-b[i]*x;
    	stable_sort(d+1,d+n+1);
    	double ans=0;
    	for(rint i=1;i<=n;i++) ans+=d[i]; 
            return ans;
    }
    int main(){
            ...............
        int gg=20;
        while(gg--)
    	{
    		double mid=(l+r)/2;
            double kk=solve(mid);
    	    if(kk>=0) l=mid;
    	    else r=mid;	
    	} 
    }
    

    最优比率(例)生成树

    概念

    有带权图G, 对于图中每条边e[i], 都有benifit[i] (收入)和cost[i] (花费), 我们要求的是一棵生成树T, 它使得 ∑(benifit[i]) / ∑(cost[i]), i∈T 最大(或最小).

    分析

    设x[i]等于1或0, 表示边e[i]是否属于生成树.

    则我们所求的比率(r = ∑(benifit[i])( imes)(x[i]) / ∑(cost[i])( imes)(x[i]), 0 ≤ i < m .)为了使 r 最大, 设计一个子问题 ---> 让 (z = ∑(benifit[i])( imes)(x[i]) - l)( imes)(∑(cost[i])( imes)(x[i]) = ∑(d[i])( imes)(x[i])) 最大 ((d[i] = benifit[i] - l * cost[i])) , 并记为z(l). 我们可以把z(l)看做以d为边权的最大生成树的总权值.

    然后明确两个性质:

     1. z单调递减
    证明: 因为cost为正数, 所以z随l的减小而增大.
     2. z( max(r) ) = 0
    证明: 若(z( max(r) ) < 0, ∑(benifit[i])( imes)(x[i]) - max(r))( imes)(∑(cost[i])( imes)(x[i]) < 0,) 可化为 max(r) < max(r). 矛盾;
    若z( max(r) ) >= 0, 根据性质1, 当z = 0 时r最大.

  • 相关阅读:
    【转】git教程
    Ubuntu下编译运行Kamailio
    windows下编译FreeSwitch
    自己常用的wireshark过滤条件
    CSRF 漏洞原理详解及防御方法
    Sql 注入详解:宽字节注入+二次注入
    Kali下Ettercap 使用教程+DNS欺骗攻击
    Sql注入的分类:数字型+字符型
    Windows Server 2012 R2 配置FTP服务器
    Kali Linux 初始化配置:Apache2 /SSH /FTP
  • 原文地址:https://www.cnblogs.com/Thomastine/p/11729537.html
Copyright © 2020-2023  润新知