码迷,mamicode.com
首页 > 其他好文 > 详细

01分数规划入门

时间:2016-05-01 13:35:27      阅读:247      评论:0      收藏:0      [点我收藏+]

标签:

01分数规划是这样的一类问题,有一堆物品,每一个物品有一个收益ai,一个代价bi,我们要求一个方案使选择的技术分享最大。

首先我们来一道例题吧,01分数规划的大体方法都是一样的。

例1 Dropping Tests poj2976

给出n个物品,每个物品有两个属性a和b,选择n-k个元素,询问技术分享的最大值。

1<=n<=1000,0<=k<n,0<=ai<=bi<=1000000000。

首先这题显然是兹磁二分的,而技术分享就等价于技术分享

所以我们发现二分完把ai-x*bi排序后把最大的n-k个选出来就行了。

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include <string.h>
#include <vector>
#include <math.h>
#include <limits>
#include <set>
#include <map>
using namespace std;
int n,k,a[2333],b[2333];
double ps[2333];
bool ok(double x)
{
    for(int i=1;i<=n;i++) ps[i]=a[i]-x*b[i];
    sort(ps+1,ps+1+n);
    double ans=0;
    for(int i=n;i>=k+1;i--) ans+=ps[i];
    return ans>=0;
}
void sol()
{
    for(int i=1;i<=n;i++) scanf("%d",a+i);
    for(int i=1;i<=n;i++) scanf("%d",b+i);
    double l=0,r=1;
    while(r-l>1e-6)
    {
        double mid=(l+r)/2;
        if(ok(mid)) l=mid; else r=mid;
    }
    printf("%.0lf\n",l*100);
}
int main()
{
    while(scanf("%d%d",&n,&k),n|k) sol();
}

01分数规划入门

标签:

原文地址:http://www.cnblogs.com/zzqsblog/p/5450361.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!