问题简介
01 01 01分数规划是一类经典的问题。简单的来说,就是有 n n n个二元组 ( c o s t i , v a l u e i ) (cost_i,value_i) (costi,valuei),从中选取一些二元组,使得 ∑ i = 1 i ⩽ n c o s t i × x i ∑ i = 1 i ⩽ n v a l u e i × x i \frac{\sum_{i=1}^{i\leqslant n} cost_i\times x_i}{\sum_{i=1}^{i\leqslant n} value_i\times x_i} ∑i=1i⩽nvaluei×xi∑i=1i⩽ncosti×xi最大(或最小)。它还会与其他问题结合,如网络流等。这种题一类通用的解法就是二分答案或 D i n k e l b a c h Dinkelbach Dinkelbach算法。在本章中我们采用的是二分答案来求解问题。
常见模型
模型1 基本01分数规划与贪心
例题1 LOJ #149. 01 分数规划
给你 n n n个物品,每个物品有两个属性 a i a_i ai和 b i b_i bi ,求一组解 x i ( 1 ⩽ i ⩽ n , x i = 0 或 1 ) x_i (1\leqslant i\leqslant n,x_i =0或1) xi(1⩽i⩽n,xi=0或1)使
∑ i = 1 i ⩽ n a i × x i ∑ i = 1 i ⩽ n b i × x i \frac{\sum_{i=1}^{i\leqslant n} a_i\times x_i}{\sum_{i=1}^{i\leqslant n} b_i\times x_i} ∑i=1i⩽nbi×xi∑i=1i⩽nai×xi
最大,且恰好有 k k k个 x i x_i xi为 1 1 1,并求出这个值。
思路 我们可以二分 r r r最大值并设它等于 m i d mid mid,则
∑ i = 1 i ⩽ n a i × x i ∑ i = 1 i ⩽ n b i × x i ⩾ m i d \frac{\sum_{i=1}^{i\leqslant n} a_i\times x_i}{\sum_{i=1}^{i\leqslant n} b_i\times x_i}\geqslant mid ∑i=1i⩽nbi×xi∑i=1i⩽nai×xi⩾mid
变形得
∑ i = 1 i ⩽ n a i × x i − m i