01分数规划

Posted profish

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了01分数规划相关的知识,希望对你有一定的参考价值。

http://www.51nod.com/Challenge/Problem.html#problemId=1257

#include<bits/stdc++.h>
#define fi first
#define se second
#define INF 0x3f3f3f3f
#define LNF 0x3f3f3f3f3f3f3f3f
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define pqueue priority_queue
#define NEW(a,b) memset(a,b,sizeof(a))
const double pi=4.0*atan(1.0);
const double e=exp(1.0);
const double eps=1e-10;
const int maxn=4e5+8;
typedef long long LL;
typedef unsigned long long ULL;
const LL mod=1e9+7;
const ULL base=1e7+7;
const int maxp=26+5;
using namespace std;
int w[maxn],p[maxn];
pair<double,int> d[maxn];
int main()
    int n,k;
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++)
        scanf("%d%d",&w[i],&p[i]);
    
    double l=0.0,r=50001.0;
    double mid;
    double sz;
    LL fz,fm;
    while(l+eps<=r)
        mid=(l+r)/2.0;
        sz=0.0;
        for(int i=1;i<=n;i++)
            d[i].fi=(double)p[i]-mid*w[i];
            d[i].se=i;
        
        sort(d+1,d+1+n);
        for(int i=n;i>=n-k+1;i--)
            sz+=d[i].fi;
        
        if(sz>=eps)
            fm=0;
            fz=0;
            for(int i=n;i>=n-k+1;i--)
                fm+=p[d[i].se];
                fz+=w[d[i].se];
            
            l=mid;
        
        else
            r=mid;
        
    
    LL g=__gcd(fm,fz);
    fm/=g;
    fz/=g;
    cout<<fm<</<<fz<<endl;

 

以上是关于01分数规划的主要内容,如果未能解决你的问题,请参考以下文章

01分数规划

01分数规划

算法微解读浅谈01分数规划

算法微解读浅谈01分数规划

算法xio讲堂#1--01分数规划

01分数规划入门