另類背包問題
by lawfung
其他背包?
分數背包
V跟W都很大的背包
分數背包
• 每個物品都可以只取部分
分數背包
• 其實可以貪心(?
• 每次都直接取最性價比最高的。
V跟W都很大的背包
• 例如 V <= 10^9, W <= 10^9
• 但是物品數量 N <= 20
V跟W都很大的背包
• 不要掉入思考的窠臼
• 啊不就枚舉嗎
• O(2^N)
V跟W都很大的背包
• 那如果 N <= 40 ?
• 折半枚舉
折半枚舉
• 今天把物品任意分兩堆A, B,
• 最後取的集合一定是
A的某子集,加上B的某個子集
• 假設我們已經知道A要取哪個子集了,B的子集該怎麼取?
• 令剩餘的背包大小(W - A子集重量總和)為L
• 那麼我們要取的是B的子集中,重量小於L中價值最大的。
折半枚舉實作
• 先把B集合的子集枚舉出來成S
• 把S中的垃圾刪掉
(就是如果有兩種取法x, y,若是y取法的價值低於x,但是重量 高於x,那就把y刪掉)
• 最後枚舉A的子集,每次都在S二分搜重量,然後得到該種A子集 取法的最大價值
• 取所有最大價值的最大值
折半枚舉
• O(2^|B| * log(2^|B|)+ 2^|A|*log(2^|B|))
• =O( |B| * (2^|A|+2^|B|) )
• 所以|A|跟|B|大約平分成兩半是最好的!!
• O( N/2 * (2^(N/2) )
• =O( N * 2^(N/2) )
折半枚舉
• POJ 2758
POJ 2785
POJ 2785 POJ 2785
POJ 2785
POJ 2785
POJ 2785 POJ 2785
POJ 2785