01分数规划是这样的一类问题,有一堆物品,每一个物品有一个收益ai,一个代价bi,我们要求一个方案使选择的最大。
首先我们来一道例题吧,01分数规划的大体方法都是一样的。
友情提示:poj请选择C++提交,g++提交的话容易作死(poj的g++要用%f输入输出double,pojC++用%lf)
例1 Dropping Tests poj2976
给出n个物品,每个物品有两个属性a和b,选择n-k个元素,询问的最大值。
1<=n<=1000,0<=k
首先这题显然是兹磁二分的,而就等价于。
所以我们发现二分完把ai-x*bi排序后把最大的n-k个选出来就行了。
#include
#include
#include
#include
#include <string.h>
#include
#include
#include
#include <set>
#include
但是还有一种神奇的做法,既然我们可以二分一个值,而且得出一个更优的解,那么我们就可以在这个解的基础上继续做,直到满足精度。
#include
#include
#include
#include
#include <string.h>
#include
#include
#include
#include <set>
#include
例2 Desert King poj2728
(模型有转化)
给出一个n个点的完全图,每条边有两个权值cost和len。
求一个生成树使最小。
2<=n<=1000
还是二分答案x,把每条边边权设为cost-x*len,跑最小生成树,判答案的正负。建议用prim跑,复杂度比较科学。
#include
#include
#include
#include
#include <string.h>
#include
#include
#include
#include <set>
#include
直接迭代
#include
#include
#include
#include
#include <string.h>
#include
#include
#include
#include <set>
#include
例3 Sightseeing Cows poj3621
给出一个有L个点P条边的有向图,每个点上有点权F,每条边上有边权T。
求一个回路使最大。
2<=L<=1000,2<=P<=5000。
因为环上边和点数相等,我们可以直接把边权当做花费,入点的点权当作收入。
然后还是二分答案建图,判图中有没有正环。取个反就成了判负环。
dfs版spfa即可。
#include
#include
#include
#include
#include <string.h>
#include
#include
#include
#include <set>
#include
迭代的话…似乎不太好写,就算了吧