NYOJ 914 Yougth的最大化 (0-1分数规划)

原创 2016年06月01日 11:30:51

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
01分数规划
01分数规划问题其实就是解决单价之类的问题,假设给你n个物品,让你找出选k个物品的最大单价。解决这类问题可以用二分查找,这类问题跟二分极大化最小值,极小化最大值有一些相似的地方,均是从结果出发,来进行二分查找。
由于v/w=单价;所以v=w*单价;即v-w*单价=0;有了这个关系,我们马上可以想到二分来查找这个值;

那么我们可以定义一个count数组来记录v-w*单价的值;由于选k个只需要把count从大到小排下序就可以了;然后就是二分了;这类问题就是01分数规划问题;

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn = 10000 + 10;

struct Node
{
    int v, w;
};
Node res[maxn];
double cont[maxn];
int n, k;

int fun(double mid)
{
    for (int i = 0; i < n; i++)
        cont[i] = res[i].v - mid * res[i].w;   //cont数组是随着mid的增大而单调减的 
    sort(cont, cont + n);
    double sum = 0;
    for (int i = n - 1; i >= n - k; i--)
        //之所以要找最大的k个数是因为sum有可能<0,不符合二分找sum趋近于0的思想 
        sum += cont[i];
    return sum >= 0 ? 1 : 0;
}

double search1(double max1)   //二分搜索最大的单位价值  
{
    double left = 0, right = max1, mid;
    while (right - left > 1e-10){
        mid = (left + right) / 2;
        if (fun(mid))
            left = mid;
        else
            right = mid;
    }
    return mid;
}

int main()
{
    while (~scanf("%d%d", &n, &k)){
        double max1 = 0;
        for (int i = 0; i < n; i++){
            scanf("%d%d", &res[i].w, &res[i].v);
            max1 = max(max1, res[i].v * 1.0 / res[i].w);    //找出最大的单位价值,做二分上界  
        }
        printf("%.2lf\n", search1(max1));
    }
    return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

Yougth的最大化

Yougth的最大化 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 Yougth现在有n个物品的重量和价值分别是Wi和Vi,你能帮他从中选出k个物品使得单位...
  • zsc2014030403015
  • zsc2014030403015
  • 2015年04月15日 17:43
  • 639

nyoj-914 Yougth的最大化

题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=914 二分法加贪心,不理解的可以上网上搜大神的。。。。。。代码: #include #i...
  • wojiaohuangyu
  • wojiaohuangyu
  • 2015年01月11日 00:25
  • 635

NYOJ914 Yougth的最大化 (最大化平均值)

一般最先想到的方法是把物品按照单位价值景行排序,选取前k个最大的,但这种方法却不可行...
  • the_love_story
  • the_love_story
  • 2016年07月22日 17:21
  • 227

0-1分数规划(nyoj914 Yougth的最大化)

Yougth的最大化 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 Yougth现在有n个物品的重量和价值分别是Wi和Vi,你能帮他从中选出k个物品使得单位...
  • y990041769
  • y990041769
  • 2014年03月07日 08:06
  • 2448

NYOJ Yougth的最大化

一道二分+贪心的题目,很好地融合了两种结题思路
  • AQ14AQ1
  • AQ14AQ1
  • 2015年04月02日 21:42
  • 426

nyoj 914 Yougth的最大化(贪心+二分搜索)

Yougth的最大化 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 Yougth现在有n个物品的重量和价值分别是Wi和Vi,你能帮他从中选出k个物品使得单位...
  • sungaochao
  • sungaochao
  • 2015年01月12日 22:34
  • 530

NYOJ 914 Yougth的最大化

题目链接 第一次遇到二分法和贪心结合的题目,算法很妙,把中间值输出理解了一下,大概是保证有解的情况下,通过二分法使单位重量的价值最大,还运用了一个结论,就是多个物品单位重量的价值一定小于单位重量价值...
  • xj13821328013
  • xj13821328013
  • 2016年08月27日 15:39
  • 424

nyoj914Yougth的最大化(二分搜索 + 贪心)

Yougth的最大化 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 Yougth现在有n个物品的重量和价值分别是Wi和Vi,你能帮他从中选出k个物品使得单位重量...
  • wangdan11111
  • wangdan11111
  • 2015年05月05日 21:49
  • 319

NYOJ 914 Yougth的最大化 (0-1分数规划)

题目914 题目信息 运行结果 本题排行 讨论区 Yougth的最大化 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 Yougth现在有n个物品的...
  • a2459956664
  • a2459956664
  • 2016年06月01日 11:30
  • 266

nyoj 914 Yougth的最大化 【0-1分数规划】

Yougth的最大化 时间限制:1000 ms  |           内存限制:65535 KB 难度:4 描述 Yougth现在有n个物品的重量和价值分别是Wi和Vi,你能帮他从中选出k个...
  • chenzhenyu123456
  • chenzhenyu123456
  • 2015年05月21日 18:26
  • 297
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:NYOJ 914 Yougth的最大化 (0-1分数规划)
举报原因:
原因补充:

(最多只允许输入30个字)