题目:有n个重量和价值分别为w(i)和v(i)的物品,从中选出k个物品是的单位重量的价值最大。
输入:n=3 k=2
(w,v)={(2,2),(5,3),(2,1)}
输出:0.75(选择0和2)
一般都会想直接按单位重量的价值排序,然后进行贪心,但是发现这种方法样例都不对!!!还是得好好分析一番啊。
#include <iostream>
using namespace std;
int n,k;
const int maxn=1000;
int w[maxn],v[maxn];
int y[maxn];
bool check(int x)
{
for(int i=0;i<n;i++)
y[i]=v[i]-x*w[i];
sort(y,y+n,greater<int>);
double sum=0;
for(int i=0;i<k;i++)
{
sum+=y[i];
}
return sum>=0;
}
void solve()
{
double lb=0,ub=99999999;
for(int i=0;i<100;i++)
{
double mid=(lb+ub)/2;
if(check(mid))
lb=mid;
else ub=mid;
}
printf("%.2f
",ub);
}