Yougth的最大化
-
描述
-
Yougth现在有n个物品的重量和价值分别是Wi和Vi,你能帮他从中选出k个物品使得单位重量的价值最大吗?
-
输入
-
有多组测试数据
每组测试数据第一行有两个数n和k,接下来一行有n个数Wi和Vi。
(1<=k=n<=10000) (1<=Wi,Vi<=1000000)
输出
- 输出使得单位价值的最大值。(保留两位小数) 样例输入
-
3 2 2 2 5 3 2 1
样例输出
-
0.75
来源
- Yougth 上传者
初学01分数规划有点不太懂。
但是经过大佬的讲解感觉明白一点点了
附上大佬的博客:
http://blog.csdn.net/zsc2014030403015/article/details/45037123
根据大佬的思想,自己试着敲了一下:
代码:
int n,k;
int w[10005],v[10005];
double cnt[10005];
int fun(double x)
{
double sum=0;
for(int i=0;i<n;i++)
cnt[i]=v[i]-x*w[i];
sort(cnt,cnt+n);
for(int i=n-1;i>=n-k;i--)
sum+=cnt[i];
return sum>=0?1:0;
}
double erfen(double r)
{
double l=0,mid;
while(r-l>0.00001)
{
mid=(l+r)/2.0;
if(fun(mid))
l=mid;
else
r=mid;
}
return mid;
}
int main()
{
while(~scanf("%d%d",&n,&k))
{
double ma=0;
for(int i=0;i<n;i++)
{
scanf("%d%d",&w[i],&v[i]);
ma=ma>v[i]*1.0/w[i]?ma:v[i]*1.0/w[i];
}
printf("%.2lf\n",erfen(ma));
}
}
-
有多组测试数据