01 分數規劃

end_switch發表於2024-09-02

問題模型

給定 \(a,b\) 兩個長度為 \(n\) 的序列,求下列式子最大值:

\[\frac{\sum_{i = 1} ^ {n} a_i · x_i}{\sum_{i = 1} ^ {n} b_i · x_i} \]

其中 \(\forall i \in [1, n], x_i \in \left \{1, 0 \right \}\)

解法

不妨設我們已經求出了這個最大值 \(k\)

那麼有:

\[\frac{\sum_{i = 1} ^ {n} a_i · x_i}{\sum_{i = 1} ^ {n} b_i · x_i} \le k \]

把分母移過去:

\[\sum_{i = 1} ^ {n} a_i · x_i \le k · \sum_{i = 1} ^ {n} b_i · x_i \]

再移右邊:

\[\sum_{i = 1} ^ {n} a_i · x_i - k · \sum_{i = 1} ^ {n} b_i · x_i \le 0 \]

\(k\) 乘進 \(\sum\) 裡面:

\[\sum_{i = 1} ^ {n} a_i · x_i - \sum_{i = 1} ^ {n} k · b_i · x_i \le 0 \]

合併 \(\sum\)

\[\sum_{i = 1} ^ {n} a_i · x_i - k · b_i · x_i \le 0 \]

提出 \(x_i\)

\[\sum_{i = 1} ^ {n} x_i · (a_i - k · b_i) \le 0 \]

於是一個整體貢獻被我們拆成了單體貢獻。

不難發現 \(k\) 影響整個式子的單調性,考慮二分 \(k\)

此時 \(x_i\) 的取值是由 \(i\) 位置所對應的貢獻決定的,把每個貢獻算出來之後再去作文章。

舉個例子,約束 \(\sum_{i = 1} ^ n [x_i] \le k\) 時,將貢獻從大到小排序,至多取前 \(k\) 個大於 \(0\) 的貢獻即可。

這裡的時間複雜度就是 \(O(n \log n \log V)\) 的,其中 \(V\) 為值域。

有時可能會與 01 揹包和生成樹等結合起來,具體的會在下面的例題部分細講。

例題

相關文章