51nod 1257 01分数规划/二分

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1257

1257 背包问题 V3

基准时间限制:3 秒 空间限制:131072 KB 分值: 80 难度:5级算法题

收藏

关注

N个物品的体积为W1,W2......Wn(Wi为整数),与之相对应的价值为P1,P2......Pn(Pi为整数),从中选出K件物品(K <= N),使得单位体积的价值最大。

Input

第1行:包括2个数N, K(1 <= K <= N <= 50000)
第2 - N + 1行:每行2个数Wi, Pi(1 <= Wi, Pi <= 50000)

Output

输出单位体积的价值(用约分后的分数表示)。

Input示例

3 2
2 2
5 3
2 1

Output示例

3/4  第一次写分数规划,感觉就是数学真神奇- -  假设我们已知选了k件,他们的单位价值就是 x = ∑(pi) / ∑(wi) , 分解一下得到 ∑(pi) - x*∑(wi) = 0 ,对于所有合法的x这个式子肯定成立,所以对于max {x}也是,我们有 ∑(pi) - x1*∑(wi) = 0 , 如果 x1==max(x) ,显然x1就是最大值 ; 如果x1<max(x)则他不是最优解 ; 如果x1>max(x) 这个式子<0说明不合法。只要二分一下x的值就好了,为了使得x尽量合法显然我们将所有的 pi-x*wi排序之后优先选择较大的即可。
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 using namespace std;
 6 #define LL long long
 7 int W[50005], P[50005];
 8 struct node { double d;int u; }D[50005];
 9 bool cmp(node A, node B) { return A.d < B.d; }
10 int gcd(int a, int b) { return b == 0 ? a : gcd(b, a%b); }
11 bool ok(double x, int N, int K, int &a, int &b)
12 {
13     for (int i = 1;i <= N;++i) {
14         D[i].d = 1.0*P[i] - x*W[i];
15         D[i].u = i;
16     }
17     sort(D + 1, D + 1 + N,cmp);
18     double s = 0; int w1 = 0, p1 = 0;
19     for (int i = N;i > N - K;i--) {
20         s += D[i].d;
21         w1 += W[D[i].u];
22         p1 += P[D[i].u];
23     }
24     if (s >= 0) {
25         int y = gcd(w1, p1);
26         a = w1 / y;
27         b = p1 / y;
28     }
29     return s >= 0;
30 }
31 int main()
32 {
33     int N, K, i, j, k;
34     cin >> N >> K;
35     for (i = 1;i <= N;++i)
36     {
37         scanf("%d%d", W + i, P + i);
38     }
39     double l = 0, r = 50000;
40     int w,p;
41     while (r - l >= 1e-8) {
42         double mid = r - (r - l) / 2;
43         if (ok(mid,N,K,w,p)) {
44             l = mid;
45         }
46         else {
47             r = mid;
48         }
49     }//cout << l << endl;
50     printf("%d/%d\n",p,w);
51     return 0;
52 }
				
时间: 2024-10-08 01:50:39

51nod 1257 01分数规划/二分的相关文章

poj2728 Desert King --- 01分数规划 二分水果。。

这题数据量较大,普通的求MST是会超时的. d[i]=cost[i]-ans*dis[0][i] 据此二分. 但此题用Dinkelbach迭代更好 #include<cstdio> #include<cstring> #include<cmath> #include<iostream> #include<algorithm> using namespace std; #define N 1010 double mp[N][N],c[N][N],x

POJ2728 最小比率生成树/0-1分数规划/二分/迭代(迭代不会)

用01分数规划 + prime + 二分 竟然2950MS惊险的过了QAQ 前提是在TLE了好几次下过的 = = 题目意思:有n个村庄,村庄在不同坐标和海拔,现在要对所有村庄供水,只要两个村庄之间有一条路即可,建造水管距离为坐标之间的欧几里德距离,费用为海拔之差,现在要求方案使得费用与距离的比值最小,很显然,这个题目是要求一棵最优比率生成树. 解题思路: 对答案进行二分,当把代进去的答案拿来算最小生成树的时候,一旦总路径长度为0,就是需要的答案. 0-1规划是啥? 概念有带权图G, 对于图中每条

[POJ2976][POJ2728]01分数规划问题的二分答案解法

这里就不放原题目了. POJ2976就是01分数规划的模板题,题目形式就是有n个物品,每个物品有对应的价值ai和代价bi,我们要取K个物品,使取的物品的  最小. 二分答案的解法特别妙,我们设 r= ,那么就有   由此不难发现,只要满足这条式子,我们能取的r越大越好. 不难发现此时已经满足二分答案的性质了. 二分r的大小,如果最后式子左边大于0,那么说明r取小了,如果左边小于0,说明r取大了. 那么我的代码如下: #include<iostream> #include<cstdio&g

[转]01分数规划算法 ACM 二分 Dinkelbach 最优比率生成树 最优比率环

01分数规划 前置技能 二分思想最短路算法一些数学脑细胞?问题模型1 基本01分数规划问题 给定nn个二元组(valuei,costi)(valuei,costi),valueivaluei是选择此二元组获得的价值(非负),costicosti是选择此二元组付出的代价(非负),设xi(xi∈{0,1})xi(xi∈{0,1})代表第ii个二元组的选与不选,最大(小)化下式 maximize(or minimize)   r=∑valuei?xi∑costi?ximaximize(or minim

[poj2976]Dropping tests(01分数规划,转化为二分解决)

题意:有n场考试,给出每场答对的题数a和这场一共有几道题b,求去掉k场考试后,公式.的最大值 解题关键:01分数规划,double类型二分的写法(poj崩溃,未提交) 或者r-l<=1e-3(右边是精度) #include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #include<iostream> #include<cmath> #defi

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

浅谈01分数规划 所谓01分数规划,看到这个名字,可能会想到01背包,其实长得差不多. 这个算法就是要求"性价比"最高的解.sum(v)/sum(w)最高的解. 定义 我们给定两个数组,a[i]表示选取i的收益,b[i]表示选取i的代价.如果选取i,定义x[i]=1否则x[i]=0.每个物品只有选和不选的两种方案,求一个选择的方案使得R=sigma(a[i]x[i])/sigma(b[i]x[i]),也就是选择物品的总收益/总代价最大或者最小. 01分数规划问题主要包含以下几个问题:

poj3621 Sightseeing Cows --- 01分数规划

典型的求最优比例环问题 参考资料: http://blog.csdn.net/hhaile/article/details/8883652 此题中,给出每个点和每条边的权值,求一个环使 ans=∑点权/∑边权 最大. 因为题目要求一个环,而且必然是首尾相接的一个我们理解的纯粹的环,不可能是其他样子的环, 所以我们可以把一条边和指向的点看做整体处理. 上面方程可以化为:ans×e[i]-p[i]=0 以它为边权二分答案,spfa求负环,有负环则该ans可行,增大下界. 若一直不可行,则无解. #i

【Earthquake, 2001 Open 】 0-1 分数规划

71  奶牛施工队一场地震把约翰家园摧毁了,坚强的约翰决心重建家园.约翰已经修复了 N 个牧场,他需要再修复一些道路把它们连接起来.碰巧的是,奶牛们最近也成立了一个工程队,专门从事道路修复.而然,奶牛们很有经济头脑,如果无利可图,它们是不会干的.约翰和奶牛达成了协议,约翰向奶牛支付 F 元,奶牛负责修路,但不必修复所有道路,只要确保所有牧场连通即可.可供奶牛选择修复的道路有 M 条,第 i 条道路连接第 Ui 个牧场和第 Vi 个牧场,修复需要 Ti 分钟,支出成本为 Ci.保证连通所有牧场的道

[Usaco2007 Dec][BZOJ1690] 奶牛的旅行|分数规划|二分|SPFA

1690: [Usaco2007 Dec]奶牛的旅行 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 700  Solved: 363[Submit][Status][Discuss] Description 作为对奶牛们辛勤工作的回报,Farmer John决定带她们去附近的大城市玩一天.旅行的前夜,奶牛们在兴奋地讨论如何最好地享受这难得的闲暇. 很幸运地,奶牛们找到了一张详细的城市地图,上面标注了城市中所有L(2 <= L <= 1000)座标志