poj2976(0-1 分数规划)

题意

给定n个二元组 ( a i , b i ) (a_{i},b_{i}) (ai​,bi​)除去n个,剩下的n-k组成集合S作 ∑ i ∈ S a i ∑ i ∈ S b i \frac{\sum_{i\in S}a_{i}}{\sum_{i\in S}b_{i}} ∑i∈S​bi​∑i∈S​ai​​使其达到最大,原题还让将其取到最近整数!

0-1分数规划

这道题是一道很典型的0-1分数规划,网上的资源看了许多,但是好像没有人介绍在求解答案的时候二分的依据,也没有人解释为何要求解max(F(L)),在这里,我将给出解释。
首先还是对整个算法大概做个描述,具体细节一会解释
1.记 F ( L ) = ∑ i = 1 i = n ( a i − L b i ) x i F(L)=\sum_{i=1}^{i=n}(a_{i}-Lb_{i})x_{i} F(L)=∑i=1i=n​(ai​−Lbi​)xi​其中 ∑ i = 1 i = n x i = n − k \sum_{i=1}^{i=n}x_{i}=n-k ∑i=1i=n​xi​=n−k
2.由上面的表达式可以知道对于固定的L使得F(L)最大时即 m a x ( F ( L ) ) max(F(L)) max(F(L))为将 a i − L b i a_{i}-Lb_{i} ai​−Lbi​进行排序取前n-k大的元素,使其 x i = 1 x_{i}=1 xi​=1其余为0,注意这里是在求F(L)的最值,而不是 ∑ i ∈ S a i ∑ i ∈ S b i \frac{\sum_{i\in S}a_{i}}{\sum_{i\in S}b_{i}} ∑i∈S​bi​∑i∈S​ai​​的最值,
3.记 m a x ( ∑ i ∈ S a i ∑ i ∈ S b i ) = a n s max(\frac{\sum_{i\in S}a_{i}}{\sum_{i\in S}b_{i}})=ans max(∑i∈S​bi​∑i∈S​ai​​)=ans对L进行二分,
当maxF(L)>0的时候则有L<max,
当maxF(L)<0时,L>max,
于是根据上两条进行二分,直到找到使得max(F(L))的L,此时的L==ans

在这里我们着重解释第3步中的二分的想法是怎么来的,其余未明白部分见大佬文章

好啦下面就开始了

对第3条的分析

1.首先对,“当maxF(L)>0的时候则有L<max”,进行解释

F ( L ) = ∑ i = 1 i = n ( a i x i ) − L ∑ i = 1 i = n ( b i x i ) = C F(L)=\sum_{i=1}^{i=n}(a_{i}x_{i})-L\sum_{i=1}^{i=n}(b_{i}x_{i})=C F(L)=∑i=1i=n​(ai​xi​)−L∑i=1i=n​(bi​xi​)=C
我们先忘掉上述的结论,重新给出一个结论:
对于某一L,若存在序列 x i x_{i} xi​满足其和未n-k,且使得F(L)>0的时候则有L<max,证明如下:
F ( L ) = ∑ i = 1 i = n ( a i x i ) − L ∑ i = 1 i = n ( b i x i ) = C > 0 F(L)=\sum_{i=1}^{i=n}(a_{i}x_{i})-L\sum_{i=1}^{i=n}(b_{i}x_{i})=C>0 F(L)=∑i=1i=n​(ai​xi​)−L∑i=1i=n​(bi​xi​)=C>0
∑ i = 1 i = n ( a i x i ) = C + L ∑ i = 1 i = n ( b i x i ) \sum_{i=1}^{i=n}(a_{i}x_{i})=C+L\sum_{i=1}^{i=n}(b_{i}x_{i}) ∑i=1i=n​(ai​xi​)=C+L∑i=1i=n​(bi​xi​)
∑ i = 1 i = n ( a i x i ) ∑ i = 1 i = n ( b i x i ) = C ∑ i = 1 i = n ( b i x i ) + L = D \frac{\sum_{i=1}^{i=n}(a_{i}x_{i})}{\sum_{i=1}^{i=n}(b_{i}x_{i})}=\frac{C}{\sum_{i=1}^{i=n}(b_{i}x_{i})}+L=D ∑i=1i=n​(bi​xi​)∑i=1i=n​(ai​xi​)​=∑i=1i=n​(bi​xi​)C​+L=D
根据上式,可以发现,存在xi使得表达式 ∑ i = 1 i = n ( a i x i ) ∑ i = 1 i = n ( b i x i ) \frac{\sum_{i=1}^{i=n}(a_{i}x_{i})}{\sum_{i=1}^{i=n}(b_{i}x_{i})} ∑i=1i=n​(bi​xi​)∑i=1i=n​(ai​xi​)​的值D>L,于是L比目标表达式最值max要小,因为max(F(L))>F(L),若存在xi使得F(L)>0,则根据不等式传递性必有max(F(L))>F(L)>0, 并且使用max(F(L))在判断下面证明也能用到,节约了代码量!

2.接下来对"当maxF(L)<0的时候则有L>max"解释

F(L)<maxF(L)<0,则可以知道对所有 x i x_{i} xi​有 F ( L ) = ∑ i = 1 i = n ( a i x i ) − L ∑ i = 1 i = n ( b i x i ) = C < 0 F(L)=\sum_{i=1}^{i=n}(a_{i}x_{i})-L\sum_{i=1}^{i=n}(b_{i}x_{i})=C<0 F(L)=∑i=1i=n​(ai​xi​)−L∑i=1i=n​(bi​xi​)=C<0,
对等式按照上面的方式进行变形
∑ i = 1 i = n ( a i x i ) ∑ i = 1 i = n ( b i x i ) = C ∑ i = 1 i = n ( b i x i ) + L = D < L \frac{\sum_{i=1}^{i=n}(a_{i}x_{i})}{\sum_{i=1}^{i=n}(b_{i}x_{i})}=\frac{C}{\sum_{i=1}^{i=n}(b_{i}x_{i})}+L=D<L ∑i=1i=n​(bi​xi​)∑i=1i=n​(ai​xi​)​=∑i=1i=n​(bi​xi​)C​+L=D<L对任意 x i x_{i} xi​成立,对于使得 ∑ i = 1 i = n ( a i x i ) ∑ i = 1 i = n ( b i x i ) \frac{\sum_{i=1}^{i=n}(a_{i}x_{i})}{\sum_{i=1}^{i=n}(b_{i}x_{i})} ∑i=1i=n​(bi​xi​)∑i=1i=n​(ai​xi​)​取的最大值max得 x i x_{i} xi​也有max<L

有了1,2得判据,就可以根据二分法进而得出答案了.

代码如下:

#include<iostream>
#include<cmath>
#include<algorithm>
#define maxsize 1004
using namespace std;
int n,k;
double a[maxsize],b[maxsize];
bool justify(double r)
{double d[maxsize];for(int i=0;i<n;i++){d[i]=a[i]-r*b[i];// cout<<d[i]<<endl;}sort(d,d+n);double sum=0;for(int i=k;i<n;i++)sum+=d[i];// cout<<sum<<endl;return sum>0;
}
int main()
{// freopen("ini","r",stdin); while(~scanf("%d%d",&n,&k)&&(n!=0||k!=0)){for(int i=0;i<n;i++)scanf("%lf",&a[i]);for(int i=0;i<n;i++)scanf("%lf",&b[i]);double l=0,r=1;while(fabs(r-l)>1e-6){double mid=(l+r)/2;if(justify(mid))l=mid;else r=mid;}int ans=(int)((r+0.005)*100);cout<<ans<<endl;}return 0;
}

poj2976(0-1 分数规划)相关推荐

  1. bzoj 3232 圈地游戏——0/1分数规划(或网络流)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3232 当然是0/1分数规划.但加的东西和减的东西不在一起,怎么办? 考虑把它们合在一起.因为 ...

  2. jzoj4017-逃跑【0/1分数规划,线段树,dp】

    正题 题目链接:https://jzoj.net/senior/#contest/show/3011/2 题目大意 n+1n+1n+1个连续的地方,每个地方有(a,b,c)(a,b,c)(a,b,c) ...

  3. jzoj3852-单词接龙【0/1分数规划,负环】

    正题 题目链接:https://jzoj.net/senior/#main/show/3852 题目大意 nnn个单词串,头尾有两个相同单词就可以连在一起,求一个最长的环使得平均单词长度最长. 解题思 ...

  4. [学习笔记]0/1分数规划

    对于一类:每个元素有两个属性A,B 选择若干个元素,使得$\frac{\sum A_i}{\sum B_i}$取到最值. 这类问题可以采用二分的方法.然后构造出模型用于判定. 推导: 二分mid 如果 ...

  5. #0/1分数规划,SPFA,负环#洛谷 1768 天路

    题目链接 分析 可以发现,这是一道0/1分数规划的题目,需要二分答案,然后判定是否存在负环,所以说bfs貌似不高效,那就用dfs吧,若二分答案为0,即不合法 代码 #include <cstdi ...

  6. 转载二分 01 分数规划即最大化平均值的证明0/1分数规划、最优比率生成树、最优比率环

    首页 新随笔 联系 管理 订阅 随笔- 20  文章- 0  评论- 9 [Algorithm]01分数规划--Update:2012年7月27日 [关键字] 0/1分数规划.最优比率生成树.最优比率 ...

  7. POJ2976——Dropping tests(0/1分数规划)

    传送门 最简单的分数规划 对于最终答案ans,有 ans=Σai∗100Σbians=\frac{Σa_i*100}{Σb_i}ans=Σbi​Σai​∗100​ 则 Σbi∗ans=Σai∗100Σ ...

  8. poj2976(0-1分数规划)

    0-1分数规划 设x[i]等于1或0. 则我们所求的比率 rate = ∑(cost[i] * x[i]) / ∑(cost[i] * x[i]), 0≤i<m . z( rate ) = ∑( ...

  9. [JSOI2016] 最佳团体(0/1分数规划 + 树形dp)

    problem luogu-P4322 solution 假设每个人是否被招募,用 xi={0,1}x_i=\{0,1\}xi​={0,1} 代替,max⁡∑pi∗xi∑si∗xi\max\frac{ ...

最新文章

  1. 不是碰不到更好的,是因为已经有了你!
  2. python中if not x: 和 if x is not None: 和 if not x is None的使用和区别
  3. python连接oracle导出数据文件
  4. jsp中两个字符串格式的日期可以相减吗_举个栗子!Tableau 技巧(126):学几个常用的日期函数...
  5. 第二章 Spark RDD以及编程接口
  6. GNU make manual 翻译( 一百零四)
  7. 求一份100行左右的C语言程序,求4个C语言程序 每个100行左右 大一水平的
  8. python 可视化_Python数据可视化
  9. android 用户中心布局,android用户中心头像选择功能的方法实现-Go语言中文社区
  10. wap手机网页html5通过特殊链接移动设备:打电话,发短信,发邮件详细教程
  11. 中央和省级产业政策匹配数据(含完整stata代码)
  12. PMP课程笔记:第9章 项目资源管理
  13. zuc算法代码详解_zuc算法的实现
  14. 【五步完美整理Windows系统】
  15. 空气质量等级c语言编程,华中科技大学C语言课设空气质量检测信息管理系统技术分析.docx...
  16. android跑马灯效果不起作用,Android实现跑马灯效果的方法
  17. 红帽linux7.2安装教程,RHEL 6.2安装(超级详细图解教程) | 系统运维
  18. 帮助你更好的理解Spring循环依赖
  19. vue项目打包部署注意点 + 宝塔面板几步部署项目
  20. matplotlib.pyplot.pie()绘制饼图

热门文章

  1. 【虚幻引擎UE】UE5仅需5个步骤快速实现AR项目调试与打包(安卓篇)
  2. 董承非路演:回答美联储加息 港股中概等热点
  3. 自习室管理系统的设计与实现(论文+源码)_kaic
  4. java解析yml文件_java读取解析application.yml
  5. php验证图片不显示,学习猿地-php 验证码图片无法显示怎么办
  6. 【数据库】ALTER TABLE 语句与 FOREIGN KEY 约束““冲突。该冲突发生于数据库““,表““, column ‘‘。
  7. 如何在程序中判断当前的qq空间图像是默认的空间图像------我现在已经不太喜欢严密的东东了
  8. 王权富贵软件:安装Python的方法
  9. 从技术转向管理的过度,如何处理
  10. 联想rs260服务器硬盘,联想 rs260服务器安装windows2012R2系统