一,01分数规划
二,wqs二分
这是一个用来解决这样一类问题的算法:
有若干个物品,要求你选出 m m m 个,选的时候带有限制,要你求出最优的方案。
用的时候有一个大前提,就是,设 g ( i ) g ( i ) g(i) 表示选 i i i 个物品的最优方案,那么将所有点 ( i , g ( i ) ) ( i , g ( i ) ) (i,g(i)) 画出来,他们一定要组成一个凸包(上凸下凸皆可),所有点都在上面的那种,这样就有一个性质:斜率单调递增或递减。
这种题的特点是:如果不限制选的个数,很容易就能求出最优方案。
下面以上凸包(从左到右斜率递减)为例子。
现在,我们的目标就是,求出 g ( m ) g ( m ) g(m)
做法是,二分一个斜率 k,然后找到斜率为k的切这个曲线于哪一点。
已知斜率,还需纵截距即可确定直线,自然也有了 g ( m ) g (m) g(m)
由图,这条直线在 y y y 轴上的截距最大时有最优解。
设这个截距为 f ( x ) f ( x ) f(x),那么经过点 ( x , g ( x ) ) ( x , g ( x ) ) (x,g(x)) 的斜率为 k k k 的直线在 y y y 轴上的截距就是 f ( x ) = g ( x ) − k x f ( x ) = g ( x ) − k x f(x)=g(x)−kx
现在问题变成了,找到最大的 f ( x ) f ( x ) f(x)。
考虑一下 f ( x ) f ( x ) f(x) 的意义,他等于 g ( x ) − k x g ( x ) − k x g(x)−kx,而 g ( x ) g ( x ) g(x) 等于选 x x x 个物品时的最优解,那么 f ( x ) f ( x ) f(x) 就相当于选的每个物品的价值都减 k k k 后的最优解。
由于我们现在要求的是最大的 f ( x ) f ( x ) f(x),也就是所有物品的价值都减 k k k 之后的最优解,根据上面的特点,在没有数量限制的情况下,最优解是很容易求d的!
求出来的最大的 f ( x ) f ( x ) f(x) 的 x x x 小于 m m m 时,根据图像,很容易知道我们应该将斜率减小,这样才能让切点右移,从而逼近点 m , g ( m ) m , g ( m ) m,g(m)