1. 程式人生 > >分數揹包問題(貪心演算法)O(n)時間求解

分數揹包問題(貪心演算法)O(n)時間求解

演算法核心:線性時間選擇演算法+貪心

問題介紹:有一個揹包,總限重為c, 還有一系列物品,他們有各自的重量(記為$w_i$)和各自的利潤$p_i$,每個物品可以只被拿走一部分。設計一個在O(n)時間內的貪心演算法使得裝入揹包的物品利潤最大化,並且總物品重量不超過$c$

演算法數學化表示:

maximize \ \ \sum \limits_{k = 1}^{n} p_ix_i

subject \ to \ \sum \limits_{k = 1}^n w_ix_i \leq c,

x_i \in [0,1]

演算法步驟:

1.給每個物品設計一個性價比公式d_i =\frac{p_i}{w_i}

2. 找出所有物品價效比的中位數median,記為m。

3. 將物品按照價效比,使用修改過的Partition進行劃分,R_1 = \{w_i | d_i < m\}, R_2 = \{w_i | d_i = m\},R_3 = \{w_i | d_i > m\}.

4.如果R_3的總重量超過c,則直接遞迴呼叫演算法對R_3進行求解。如果R_2和R_3的總重量超過c,則遞迴呼叫演算法對R_2進行求解。否則對R_1進行遞迴求解。

演算法複雜度:T(n) = T(\frac{n}{2}) + O(n)