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(); }
时间: 2024-10-12 18:43:30