题目:挑战程序设计 p143
有 n 个物品的重量和价值分别是 wi 和 vi 。从中选出 k 个物品使得单位重量的价值最大
1<=k<=n<=10^4
1<=w[i],v[i]<=10^6
输入
第一行输入n和k
接下来n+1行,每行输入w[i],v[i]
输出
输出选出 k 个物品使得单位重量的价值最大值,结果保留两位小数
Input
3 2
2 2
5 3
2 1
Output
0.75(0号和2号物品,括号内不输出)
#include <cstdio>
#include <algorithm>
using namespace std;
const int MAX_N = 10005;
const int MAX_V = 1000005;
const int INF = 0x3f3f3f3f;
int n, k;
int w[MAX_N], v[MAX_V];
double y[MAX_N]; //v-x*w
//判断是否满足条件
bool C(double x){
for(int i = 0;i < n;i ++)
y[i] = v[i] - x * w[i];
sort(y, y + n);
//计算y数组中从大到小前k个数的和
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(C(mid)) lb = mid;
else ub = mid;
}
printf("%.2f\n", ub);
}
int main(){
scanf("%d%d", &n, &k);
for(int i = 0;i < n;i ++)
scanf("%d%d", &w[i], &v[i]);
solve();
return 0;
}