题目信息:
Yougth的最大化
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
4
-
描述
-
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
-
有多组测试数据
此题应用到二分和贪心两种算法
AC代码:
# include <stdio.h>
# include <algorithm>
using namespace std;
bool tanxin(double mid);
double get_vm();
double v[10005];
double w[10005];
double y[10005];
double max_ave;
# define eps 1e-4
int n, k;
int main(void)
{
while (~scanf("%d %d", &n, &k))
{
int i;
max_ave = 0.0;
for (i = 0; i < n; i++)
{
scanf("%lf %lf", &w[i], &v[i]);
double v_w = v[i] / w[i];
if (v_w > max_ave) // 寻找最大的价值,因为所求的值在0-最大价值之间
{
max_ave = v_w;
}
}
printf("%.2lf\n", get_vm());
}
return 0;
}
double get_vm()
{
double r = max_ave;
double l = 0.0;
while (r - l > eps)
{
double mid = (l + r) / 2;
if (tanxin(mid))
{
l = mid;
}
else
{
r = mid;
}
}
return l;
}
bool tanxin(double a)
{
int i;
for (i = 0; i < n; i++)
{
y[i] = v[i] - w[i] * a;
}
sort(y, y + n); // 按数组y的升序进行排列
double sum = 0.0;
for (i = 0; i < k; i++)
{
sum += y[n-1-i];
}
return sum >= 0.0 ? true : false;
}