码迷,mamicode.com
首页 > 其他好文 > 详细

01分数规划模板

时间:2016-08-04 23:02:52      阅读:404      评论:0      收藏:0      [点我收藏+]

标签:

/*
    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\n",ans*100); ///原题是百分数所以*100
    }
    return 0;
}

 

01分数规划模板

标签:

原文地址:http://www.cnblogs.com/Kurokey/p/5738605.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!