一、题目内容
题目描述:
有n个物品的重量和价值分别为wi和vi,从中选出k个物品使得单位重量的价值最大
样例输入:
n=3
k=2
【w,v】=【2,2】,【5,3】,【2,1】
样例输出:
0.75
二、代码及注释
#include<cstdio>
#include<algorithm>
//思路:这种题有一个统一模式:设定一个判定函数用于判断数据是否符合条件,用二分查找不断获得数据
using namespace std;
const int Max_L=1001;
const int INF=2000005;
double y[Max_L];
int v[Max_L],w[Max_L];
int n,k;
//判断函数
bool judge(double x){
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-1-i]; //这里记得是倒序
}
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",ub);
}
int main(){
while(scanf("%d%d",&n,&k)!=EOF){
for(int i=0;i<n;i++){
scanf("%d%d",&w[i],&v[i]);
}
solve();
}
return 0;
}