POJ 2976

http://poj.org/problem?id=2976

01分数规划问题,可以舍掉k组

01分数规划用于解决的经典问题是最优比率生成树

解法见http://www.cnblogs.com/lotus3x/archive/2009/03/21/1418480.html

#include <iostream> 

#include <cstdio>

#include <algorithm>



using namespace std;



double eps = 1e-8;



double b[1005], c[1005], d[1005];



int main() {

    int n, k;

    while(~scanf("%d%d", &n, &k)) {

        if(!n && !k) break;

        for(int i = 0; i < n; i++)

            scanf("%lf", &b[i]);

        for(int i = 0; i < n; i++)

            scanf("%lf", &c[i]);

        double L = 0.0;

        double R = 1.0;

        double mid;

        while(R - L > eps) {

            mid = (L + R) / 2;

            for(int i = 0; i < n; i++)

                d[i] = b[i] - mid * c[i];

            double z = 0.0;

            sort(d, d + n);

            for(int i = k; i < n; i++)

                z += d[i];

            if(z > eps) L = mid;

            else R = mid;

        }

        printf("%d\n", (int)(mid*100+0.5));

    }

    return 0; 

}
View Code

 

你可能感兴趣的:(poj)