问题 L: 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
 1 /*解题思路:
 2  
 3 这道题目是一道0-1分数规划求最优值。方法是一个二分搜索+贪心的题目。
 4 
 5 出这道题目就是告诉大家二分不仅可以查找,还可以搜索一个更优值。
 6 
 7 要使得单位重量的价值最大,则其最大不超过单个中最大的单位重量的价值,最小当然不小于0.
 8 
 9 那么我们就在这0--最大单位重量的价值中间找一个值ans,使得ans为满足题目条件的最大值。
10 如果满足条件,则可以找更大的。设置一个条件。既二分搜索、从n个物品中找k个使得k个的价值和/质量和>=ans
11 为了使得ans尽可能的大,那么这里就要贪心选择。*/
12 
13 #include<cstdio>
14 #include<algorithm>
15 
16 using namespace std;
17 const int N = 11000;
18 int w[N], v[N];
19 double y[N];
20 int n, k;
21 int chack(double x) {
22     for(int i = 0; i < n; i++) {
23         y[i] = v[i] - x * w[i];
24     }
25     sort(y, y + n);
26     double sum = 0;
27     for(int j = 0; j < k; j ++) {
28         sum += y[n - j - 1];
29     }
30     return sum >= 0;
31 }
32 
33 double reaerch(double enf) {
34     double l = 0, r = enf, mid;
35     for(int i = 0; i < 100; i++) {
36         mid = (l + r) / 2;
37         if(chack(mid))
38             l = mid;
39         else
40             r = mid;
41     }
42     return l;
43 }
44 
45 int main( ) {
46     while(scanf("%d%d", &n, &k) != EOF) {
47         double ma = 0;
48         for(int i = 0; i < n; i ++) {
49             scanf("%d%d", &w[i], &v[i]);
50             double cmp = v[i] / w[i];
51             if(cmp > ma)
52                 ma = cmp;
53         }
54         printf("%.2lf
", reaerch(ma));
55     }
56     return 0;
57 }
View Code
原文地址:https://www.cnblogs.com/tong69/p/5802157.html