代码:《挑战程序设计竞赛》3.1.3
#include<iostream>
#include<algorithm>
using namespace std;
#define MAX_N 10000
#define INF 100000
int n, k; //n为总的物品数目,k为取出的物品数目
int w[MAX_N], v[MAX_N]; //分别记录每个物品的重量和价值
double y[MAX_N]; //记录y = v - x * w的值
bool judge(double x) //判断是否能由题目数据得到单位价值为x的取法,即是否能满足∑(v[i]-x*w[i]) >= 0
{
for (int i = 0; i < n; i++)
{
y[i] = v[i] - x * w[i];
}
sort(y, y + n);
double sum = 0;
for (int i = 0; i < k; i++)
{
sum += y[n - i - 1];
}
return sum >= 0;
}
void solve()
{
double lb = 0, ub = INF;
for (int i = 0; i < 100; i++)
{
double mid = (lb + ub) / 2;
if (judge(mid)) lb = mid;
else ub = mid;
}
printf("%.2f\n", lb);
}
int main()
{
cin >> n >> k;
for (int i = 0; i < n; i++)
{
cin >> w[i] >> v[i];
}
solve();
return 0;
}
//测试用例
/*
3
2
2 2
5 3
2 1
*/