题目内容:
有n个物品的重量和价值分别是wi和vi,从中选出k个物品使得单位重量的价值最大。
输入
n = 3,k = 2;
(w,v)={(2,2),(5,3),(2,1)};
题目分析:
采用二分法做
定义一个函数bool C(x):可以选择使得单位重量的价值不小于x
则选了k个后,单位重量的价值是:
∑i=1kvi/∑i=1kwi
我们要求的是在
∑i=1kvi/∑i=1kwi>=x
的情况下,x的最大取值。
∑i=1kvi/∑i=1kwi>=x
可以变形为
∑i=1k(vi−x∗wi)>=0
主要代码如下
bool C(int x){
int y[100005];
for(int i = 1 ; i <= n ; i ++){
y[i] = (v[i]-x*w[i]);
}
sort(y+1,y+n+1);
int sum = 0;
for(int i = n ; i >= n-k+1;i--){
sum += y[i];
}
return sum >= 0;
}
void solve(){
double lb = 0 ,ub =INF;
for(int i = 0 ; i < 100 ; i ++){
double mid = (lb + ub) >> 1;
if(C(mid))lb = mid;
else ub = mid;
}
printf ub;
}