最大化平均值

题目:有n个重量和价值分别为w(i)和v(i)的物品,从中选出k个物品是的单位重量的价值最大。

输入:n=3 k=2
(w,v)={(2,2),(5,3),(2,1)}
输出:0.75(选择0和2)
一般都会想直接按单位重量的价值排序,然后进行贪心,但是发现这种方法样例都不对!!!还是得好好分析一番啊。

题解

#include <iostream>

using namespace std;
int n,k;
const int maxn=1000;
int w[maxn],v[maxn];
int y[maxn];
bool check(int x)
{
    for(int i=0;i<n;i++)
       y[i]=v[i]-x*w[i];

    sort(y,y+n,greater<int>);
        double sum=0; 
    for(int i=0;i<k;i++)
    {
        sum+=y[i];
    }
    return sum>=0;
}
void solve()
{
    double lb=0,ub=99999999;
    for(int i=0;i<100;i++)
    {
        double mid=(lb+ub)/2;
        if(check(mid))
            lb=mid;
        else ub=mid;
    }
    printf("%.2f\n",ub);
}

posted @ 2017-08-13 21:29  Bryce1010  阅读(67)  评论(0编辑  收藏  举报