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;
}


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

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

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

NYOJ 914 Yougth的最大化

Yougth的最大化 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 Yougth现在有n个物品的重量和价值分别是Wi和Vi,你能帮他从中...

nyoj 914 Yougth 最大化

nyoj 914 贪心 二分

nyoj 题目914 Yougth的最大化

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

NYOJ 914-Yougth的最大化(二分)

Yougth的最大化 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 Yougth现在有n个物品的重量和价值分别是Wi和Vi,你能帮他从中...

NYOJ914Yougth的最大化

描述 Yougth现在有n个物品的重量和价值分别是Wi和Vi,你能帮他从中选出k个物品使得单位重量的价值最大吗? 输入有多组测试数据 每组测试数据第一行有两个数n和k,接下来...

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

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

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

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

南阳理工OJ_题目914 Yougth的最大化

思路源自: 代码原创

南阳理工914Yougth的最大化

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

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