0/1分数规划学习笔记
由于模拟赛出了这道题而本蒟蒻对分数规划一无所知,所以痛定思痛地学习分数规划,介绍0/1分数规划的相关知识以及分享本人心中对分数规划的浅薄理解,如有不妥或错误,敬请各路大佬在评论区指正。
(这是我写的最认真的数学笔记)
1、0/1分数规划模型
0/1分数规划模型是指,给定一系列整数(a_1),(a_2)......(a_n)以及(b_1),(b_2)......(b_n),求一组解(x_i)((1leq i leq n),(x_i=0 |1)),使得下式最大化。
这里有一个误区(是我存在过的误区),就是0/1分数规划的(x_i)值是恒定的,也就是说,针对于上式,不存在分子的(x_i)为0而分母的(x_i)得1的情况。而必须是同时得0或同时得1.
所以我们会发现,这个模型可以这样去理解:
给定长度相等的两个数列(即若干对整数(a_i),(b_i)),从中选出若干对,使得选出的数对的(a)之和和(b)之和的商最大。
这个模型很重要!!!
2、针对0/1分数规划模型的推论
我们在考虑解决0/1分数规划问题的时候,其实就是在找一组解{(x_1,x_2,x_3,cdots x_n)},(x_iin {0,1}),使得上面的式子成立。
我们随便猜测一个值(A),使得下式成立:
如果存在这样一组解
那么我们把上式变形得到:
即:
也就是说,这个设出来的值(A)要比我们所求的最大值小
如果我们存在任意一组解使得下式成立
那么我们同样可以把上式变形得到:
同理,我们得到:
也就是说,这个设出来的值(A)要比我们求的最大值大。
所以,通过以上的论述,我们发现,我们所求的最大值,其实可以用二分答案来实现,事实上,这的确也是0/1分数规划的最常见、最常用的实现方式。
3、0/1分数规划的实现
刚刚我们已经说过,0/1分数规划的最常见、最常用的实现方式是二分答案,联想到二分算法,我们能够想出,二分答案的精髓和难点在于判断函数check()的书写,那么针对于二分答案解决0/1分数规划,我们能够通过刚刚的推导发现,我们只需要判断“是否存在一组解满足(sum_{i=1}^{n}({a_i}-Acdot{b_i})cdot{x_i}geq0)”,并由此得到应该向上拓展答案区间还是向下拓展答案区间。
所以,我们把原问题转化为:给定(a_1),(a_2)......(a_n),(b_1),(b_2)......(b_n)及(A),求一组解:(x_1,x_2,x_3,cdots x_n),使得(sum_{i=1}^{n}({a_i}-Acdot{b_i})cdot{x_i})最大化。
通过刚才的推导,我们发现,针对于这个问题,我们只需要判断这个最大值是否非负即可,所以,我们得出了二分思路:
在实数域(解的可能区间)二分mid,我们取的每一个mid其实是刚刚问题中的(A),也就是说,我们需要计算这个式子的最大值,检查是否非负,如果非负,则右移区间,否则左移。
求解完毕。