(解題報告本人所寫,博客內容轉自zeroclock)
這短時間看了論文《揹包九講》,看到揹包問題解法中的優美之處也看到揹包問題在現實中的應用,總結出一句話:揹包問題值得一看。
揹包問題可以概括爲這樣的模型:有若干種選擇,每種選擇有一定的代價和價值,做某些選擇會得到特定的狀態,問我們在約定的條件下怎麼得到特定的狀態?這裏的狀態可以是代價和或者價值和或者由其他這兩者組合而來的狀態。這類問題需要枚舉每種狀態,但是可以通過動態規劃減少枚舉的次數,提高效率,主要思想是每次都利用前面得到的狀態進行轉移得到當前的狀態。這類問題很少能用貪心的,首先,貪心很難證明策略是否正確,其次貪心必定使得枚舉量大量減少,會導致結果錯誤。
個人認爲揹包九講中的很多模型本質都是兩種模型:01揹包模型、完全揹包模型。大家可以把這兩種模型理解透徹,然後再看其他模型,這樣必定事半功倍。
看《揹包九講》的過程中開了一個專題,大概26道題目,主要是Hdu和Poj的題目,題目有難有易,這次的專輯主要講解這些題目,還有一些Uva的簡單揹包問題也會加入到這個專輯中。本專輯都只列舉基本思路,如果大家想看詳細思路或者代碼請去我博客中查找,大部分題目我都有寫解題報告。
一、01揹包問題 (先枚舉物品,再逆序枚舉容量)
1、Hdu 2602 Bone Collector 非常常規的01揹包問題,用一維和二維數組都可以做,一維快相當多。解題報告
2、Poj 3624 Charm Bracelet 赤裸裸的01揹包問題。解題報告
3、Hdu 2546 飯卡 n種菜選若干種使剩下的錢最少,揹包容量是開始時的錢,物品體積是菜的價格,狀態轉移時記錄答案。解題報告
4、Uva 624 CD 常規的01揹包,但要輸出路徑,狀態轉移時記錄當前狀態下當前物品是否被選用,然後遞歸求解就好。解題報告
5、Uva 562 Dividing coins 平衡問題,將n個硬幣的總價值累加得到sum,再用sum/2作爲揹包容量對n個硬幣做01揹包處理,看能組成的最大容量是多少。解題報告
6、Hdu 2955 Robberies (推薦)搶劫方案最優問題,需要一個簡單地轉換,我們求的是不被抓的概率而非被抓的概率,各個銀行的儲蓄總和爲揹包容量,體積爲單個銀行 的儲蓄,價值爲不被抓概率。解題報告
7、Poj 2184 Cow Exhibition(推薦)變形的01揹包,其實問題的本質是保證智商和幽默感和不爲負數情況下的最大和。智商屬性體積,幽默感屬性爲價值,問題轉換爲求體積大等於0時的體積、價值總和。 解題報告
8、Hdu 2639 Bone Collector II 求價值第K大的01揹包問題,技巧是多加一維表示第k大時的價值,轉移的時候用兩個有序數列合併的方法不斷更新第二維。解題報告
9、Poj 2923 Relocation(推薦,較綜合) 用到狀態壓縮思想的01揹包。先枚舉選若干個時的狀態,總狀態量爲1<<n,判斷集合裏的物品能否一次運走,如果能運走,那就把這個狀態看成一個物品。預處理完找到tot個物品,再對這tot個物品進行01揹包處理,每個物品的體積是state[i],價值是1,求必選n個物品的最少價值。狀態轉移方程:dp[j|k] = min(dp[j|k],dp[k]+1) (k爲state[i,1<=j<=(1<<n)-1])
2、Poj 3624 Charm Bracelet 赤裸裸的01揹包問題。解題報告
3、Hdu 2546 飯卡 n種菜選若干種使剩下的錢最少,揹包容量是開始時的錢,物品體積是菜的價格,狀態轉移時記錄答案。解題報告
4、Uva 624 CD 常規的01揹包,但要輸出路徑,狀態轉移時記錄當前狀態下當前物品是否被選用,然後遞歸求解就好。解題報告
5、Uva 562 Dividing coins 平衡問題,將n個硬幣的總價值累加得到sum,再用sum/2作爲揹包容量對n個硬幣做01揹包處理,看能組成的最大容量是多少。解題報告
6、Hdu 2955 Robberies (推薦)搶劫方案最優問題,需要一個簡單地轉換,我們求的是不被抓的概率而非被抓的概率,各個銀行的儲蓄總和爲揹包容量,體積爲單個銀行 的儲蓄,價值爲不被抓概率。解題報告
7、Poj 2184 Cow Exhibition(推薦)變形的01揹包,其實問題的本質是保證智商和幽默感和不爲負數情況下的最大和。智商屬性體積,幽默感屬性爲價值,問題轉換爲求體積大等於0時的體積、價值總和。 解題報告
8、Hdu 2639 Bone Collector II 求價值第K大的01揹包問題,技巧是多加一維表示第k大時的價值,轉移的時候用兩個有序數列合併的方法不斷更新第二維。解題報告
9、Poj 2923 Relocation(推薦,較綜合) 用到狀態壓縮思想的01揹包。先枚舉選若干個時的狀態,總狀態量爲1<<n,判斷集合裏的物品能否一次運走,如果能運走,那就把這個狀態看成一個物品。預處理完找到tot個物品,再對這tot個物品進行01揹包處理,每個物品的體積是state[i],價值是1,求必選n個物品的最少價值。狀態轉移方程:dp[j|k] = min(dp[j|k],dp[k]+1) (k爲state[i,1<=j<=(1<<n)-1])
10、Hdu 3466 Proud Merchants 與順序有關的01揹包,先按q-p排序再來處理,難想容易敲。解題報告
11、Hdu 2126 Buy the souvenirs n個物品,m元錢,每個物品最多買一次,問最多可以買幾件物品,並且輸出方案數。加一維表示已經買幾件物品。解題報告
12、Hdu 4281 Judges' response(推薦,綜合題) 和以上第9的思路差不多,但這題的判斷條件更簡單,本題還有一問是mTSP,甚是經典。詳細題解見Here
二、完全揹包問題(先枚舉物品,再正序枚舉容量)
7、3623 Battle Ships 建塔打大怪獸,有n種塔,任意建多少個,建塔有時間,建好的塔可以一直打怪獸。把時間當作容量,把打對方多少血當作價值。
8、Zoj 3524 Crazy Shopping(推薦) 拓樸排序+完全揹包,先拓樸排序,注意可能有好幾個起點,然後按照拓撲序轉移,每轉移一次就對下一個點進行完全揹包,同時注意更
新所用的能量。
9、Zoj 3662 Math Magic 剛結束的長春區域賽的H題,把每個m的因子當作物品,要求我們隨便選k個物品,使得這些物品的總和爲n,Lcm爲m。dp[i][j][k]表示選了i個物品,和爲jlcm爲k的方案數,具體做法是先預處理找出m的所有因子,這樣不管怎麼選,最後都有可能Lcm爲m,免除很多無必要的計算,然後用這類揹包的方法進行轉移。
1、Hdu 1114 Piggy-Bank 簡單多重揹包,但當成01揹包來暴力也完全沒有問題,
2、Hdu 1059 Dividing 簡單多重揹包,體積爲硬幣數,價值爲幣值,可用二進制處理成01揹包求解,可用30對num進行優化。
3、Hdu 2191 悼念512汶川大地震遇難同胞——珍惜現在,感恩生活 標題超長超簡單的多重揹包,可用01揹包求解。
4、Poj 1276 Cash Machine 多重揹包,需用二進制處理成01揹包求解,體積是硬幣數量,價值是幣值。
5、Poj 2392 Space Elevator 最大容量不定的多重揹包,體積是每種木塊的高度,由於可行性問題無價值這個概念。
1、Hdu 1712 ACboy needs your help 選課複習問題,沒門課只能選一次,找個時間複習,求最大的收益。每門課對應一組,每個時間對應一個物品。
2、Hdu 3033 I love sneakers! xx買鞋問題,分組揹包的變形,每種牌子至少選一雙,這與分組的最多選一個不一樣,但思想一樣,物品爲每種牌子的各種鞋子。
3、Poj 1837 Balance 平衡問題,把每個砝碼在每個位置的權值算出來,每個砝碼一個分組,幾個位置幾個物品,最後求的是價值和爲0的方案數。
4、Poj 3211 Washing Clothes Show幸福題,每種顏色的衣服的分到一組,費用是洗一件衣服的時間,每組求解出最少時間,再逐組累加起來。
5、Hdu 3810 Magina (推薦,綜合) 搜索加分組揹包,分組揹包必須用單調隊列模擬,因爲容量特別大,沒辦法按照常規進行轉移。
6、Hdu 3535 AreYou Busy (推薦,混合揹包),各種揹包混合,要求對01、完全、多重揹包都有深入的理解。
五、樹形揹包問題(在樹上進行分組揹包處理)
1、Poj 1155 TELE 把每個節點的子節點看成一組揹包,最大容量是這點的葉子子孫數量,選幾個節點就是選擇的容量,價值就是用戶給的Money-中轉費用。解題報告Here
3、Poj 1947 Rebuilding Roads 求最少刪除幾條邊使得子樹節點個數爲p,具體的模型和上題很像。解題報告Here
4、Hdu 1561 The more, The Better 在一棵樹上選擇若干個點獲得的最大價值,選子節點必須先選父節點,求解情況和上兩題相同。解題報告Here
5、Hdu 4003 Find Metal Mineral (推薦,好題) 樹形DP+選且只能選一個物品的分組揹包,狀態轉移方程難想。解題報告here
6、Poj 2486 Apple Tree 樹形DP+分組揹包,但是狀態轉移方程要分三步,較爲難想。解題報告Here
7、Poj 3345 Bribing FIPA 樹形DP+分組揹包,和前面幾題相比沒有特殊的地方,只是要注意輸入。具體可見Here
8、Hdu 4044 GeoDefense 樹形DP+分組揹包,要求從每個兒子結點獲取最小的hp,然後找這些兒子的最大組合,不是特別好想。解題報告見Here
9、Zoj 3627 Treasure Hunt II 樹形DP +分組揹包,浙大月賽的水題,很普通的樹形揹包。
9、Zoj 3627 Treasure Hunt II 樹形DP +分組揹包,浙大月賽的水題,很普通的樹形揹包。
這篇文章將會不斷更新,以後沒遇到這五類揹包,我都會整理進這個專題,希望大家保持關注。
本文ZeroClock原創,但可以轉載,因爲我們是兄弟。