题目:《挑战程序设计》P143
有 n 个物品的重量和价值分别是 wi 和 vi 。从中选出 k 个物品使得单位重量的价值最大
1<=k<=n<=10^4
1<=w[i],v[i]<=10^6
Input :
3 2
2 2
5 3
2 1
Output:
0.75
二分思想:
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> using namespace std; const int MAXN=100000; const int INF=10E6; double v[MAXN],w[MAXN],c[MAXN]; int N,K; bool calc(double mid){ for(int i=0;i<N;i++) c[i]=v[i]-mid*w[i]; sort(c,c+N); double sum=0; for(int i=1;i<=K;i++) sum+=c[N-i]; return sum>=0; } void solve(){ double right=INF,left=0; for(int i=0;i<100;i++){ double mid=(left+right)/2; if(calc(mid)) left=mid; else right=mid; } printf("%.2f ",left); } int main(){ while(cin>>N>>K){ for(int i=0;i<N;i++) cin>>w[i]>>v[i]; solve(); } }