zoukankan      html  css  js  c++  java
  • 0/1分数规划

    参照

    有两个数字n,k,两个大小为n的数组a,b,将其分成k-n(包含)份,使得

    R=sigma(ai)/sigma(bi)

    最大。

    我们将之化成di=ai-r*bi,求d的和,二分求出来r的最大值就行了。

    POJ2976

    //01分数规划 
    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    int n,k;
    int a[1010],b[1010];
    double d[1010];
    const double eps=1e-7;
    inline bool ok(double x)
    {
        for(int i=1;i<=n;i++)
        d[i]=a[i]-x*b[i];
        sort(d+1,d+1+n);
        double ans=0;
        for(int i=n;i>=k+1;i--)ans+=d[i];
        return ans>=0;
    }
    
    int main()
    {
        while(scanf("%d%d",&n,&k) and n|k)
        {
            for(int i=1;i<=n;i++)scanf("%d",a+i);
            for(int i=1;i<=n;i++)scanf("%d",b+i);
            double l=0,r=1;
            while(r-l>eps)
            {
                double mid=(l+r)/2;
                if(ok(mid))l=mid;
                else r=mid;
            }
            printf("%.0f
    ",l*100);
        }
        return 0;
    }
  • 相关阅读:
    Java8-Stream-No.10
    Java8-Stream-No.09
    Java8-Stream-No.08
    Java8-Stream-No.07
    Java8-Stream-No.06
    Java8-Stream-No.05
    Java8-Stream-No.04
    Java8-Stream-No.03
    Java8-Stream-No.02
    Java8-Stream-No.01
  • 原文地址:https://www.cnblogs.com/BrotherHood/p/13144082.html
Copyright © 2011-2022 走看看