zoukankan      html  css  js  c++  java
  • 01分数规划模板

    /*
        01分数规划模板(Dinkelbach)
        01分数规划就是把 sum(a)/sum(b)转换成 f(x)=sum(a)-ans*sum(b);
        当f(x)取到0时,ans取到了最大(小)值
        poj 2976 
        两个长度为n的数组a,b
        可以除去m个,怎样选择才能使剩下的 
        sum(a)/sum(b)的百分数最大  
    */
    
    
    int n,m;
    struct Node{
        int a,b;
        double v;   ///用于排序筛选较大的值(题目要求极大值
        bool operator<(const Node&a)const{
            return v<a.v;
        }
    }node[N];
    double d[N];
    double check(double ans){
        for(int i=1;i<=n;++i)node[i].v=node[i].a-ans*node[i].b;
        sort(node+1,node+n+1);
        double c=0,_b=0;
        for(int i=m+1;i<=n;++i){
            c+=node[i].a;
            _b+=node[i].b;
        }
        return c/_b;  ///模拟sum(a)/sum(b)
    }
    int main(){
        int i,j,group,temp;
        while(scanf("%d%d",&n,&m)!=EOF&&(n||m)){
            for(i=1;i<=n;++i)scanf("%d",&node[i].a);
            for(i=1;i<=n;++i)scanf("%d",&node[i].b);
            double ans,temp=0;///temp用于校验答案,初始为任意值均可
            do{
                ans=temp;
                temp=check(ans);
            }while(fabs(ans-temp)>1e-4); ///根据题目要求改精度
            printf("%.0f
    ",ans*100); ///原题是百分数所以*100
        }
        return 0;
    }
  • 相关阅读:
    CentOS7.4安装Docker
    责任链模式
    策略模式
    状态模式
    解释器模式
    备忘录模式
    中介者模式
    观察者模式
    迭代器模式
    private、default、protected和public的作用域
  • 原文地址:https://www.cnblogs.com/Kurokey/p/5738605.html
Copyright © 2011-2022 走看看