作者fatcat8127 (胖胖貓)
看板Prob_Solve
標題[問題] 請教zerojudge c824 / c835 的背包問題
時間Wed Feb 27 00:35:38 2019
如題,這兩題的題目敘述和要求都是相同的,但特別之處在於物品的重量和背包負重都是2
的次方項,要求和01背包問題一樣問價值總和最大化。
想問一下解題方向或是想法,自己google了一下沒看到有題解也不知道怎麼下關鍵字和01背
包做區隔,先謝謝各位大大的回覆。
因為輸入的物品數量高達1e6個,而且重量和2的次方項有關,就異想天開想說會不會和
Huffman-Code 的編碼方式有關,所以寫了一個初版本,通過51%測資而已。
以下是我的程式碼:
https://www.codepile.net/pile/A71bYyDz
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.113.208.164
※ 文章網址: https://www.ptt.cc/bbs/Prob_Solve/M.1551198940.A.FA1.html
※ 編輯: fatcat8127 (36.226.99.91), 02/27/2019 04:20:18
※ fatcat8127:轉錄至看板 C_and_CPP 02/27 05:14
推 oToToT: 對於重量2^k時,我們把價值最大的兩個合在一起湊出重量2^{ 02/27 19:52
→ oToToT: k+1}的物品,一直做到重量2^k的剩下一個或零個。如果剩一 02/27 19:52
→ oToToT: 個我們再考慮加入一個重量2^k價值為0的物品,讓剩的那個也 02/27 19:52
→ oToToT: 可以合上去,這樣直接看重量2^M中,價值最大的那個物品就 02/27 19:52
→ oToToT: 好。因為可以證明在每個重量最多加入一個價值為0的東西時 02/27 19:52
→ oToToT: ,用最優解選完選到一些價值為0的東西並不會影響答案 02/27 19:52
→ fatcat8127: 感謝大大的說明和程式碼 02/28 01:52
→ fatcat8127: 根據我自己的理解和今天討論區的回覆,解法就是建立B 02/28 03:57
→ fatcat8127: inominal Heap的過程嗎 02/28 03:57