思路源自:http://blog.csdn.net/lyhvoyage/article/details/23247561
代码原创:
//分析:k个物品单位重量的最大价值一定不会超过单个物品单位价值的最大值,
//且一定不小于0,这样我们就求出了最终答案所在的区间。
//然后利用二分压缩区间,直到求出最终结果。
#include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace std;
int cmp(const void *a, const void *b);
struct data
{
double w;
double v;
double t;
};
int n;
int k;
data a[10010];
int main()
{
while(cin >> n >> k)
{
int max_t = 0;
for(int i = 1; i <= n; i++)
{
cin >> a[i].w >> a[i].v;
max_t = max_t > a[i].v / a[i].w ? max_t : a[i].v / a[i].w;
//找到最大的单位价值,所求值在0~max_t之间
}
double l = 0;
double r = max_t;
for(; r - l > 0.00001; )
{
double mid = (r + l) / 2;
double v = 0;
for(int i = 1; i <= n; i++)
a[i].t = a[i].v - a[i].w * mid; //a[i].t 存放自身价值 - 重量 * 中间单位价值
qsort(a+1, n, sizeof(a[0]), cmp); //从大到小排序
for(int i = 1; i <= k; i++)
v += a[i].t;
if(v >= 0) //说明单位价值还可以更大,在mid~r区间
l = mid;
else
r = mid; //说明单位价值比mid小,在l~mid区间
}
printf("%0.2lf\n", l);
}
}
int cmp(const void *a, const void *b)
{
if( ((data *)a)->t < ((data *)b)->t )
return 1;
else
return -1;
}