一,部分背包問題介紹
首先介紹下0-1背包問題。假設一共有N件物品,第 i 件物品的價值為 Vi ,重量為Wi,一個小偷有一個最多只能裝下重量為W的背包,他希望帶走的物品越有價值越好,請問:他應該選擇哪些物品?
0-1背包問題的特點是:對於某件(更適合的說法是:某類)物品,要么被帶走(選擇了它),要么不被帶走(沒有選擇它),不存在只帶走一部分的情況。
而部分背包問題則是:可以帶走一部分。即,部分背包問題可帶走的物品 是可以 無限細分的。(連續與離散的區別)
可以把0-1背包問題中的物品想象的一個金子,你要么把它帶走,要么不帶走它;而部分背包問題中的物品則是一堆金粉末,可以取任意部分的金粉末
二,部分背包問題的貪心算法
部分背包問題可以用貪心算法求解,且能夠得到最優解。
貪心策略是什么呢?將物品按單位重量 所具有的價值排序。總是優先選擇單位重量下價值最大的物品。
單位重量所具有的價值:Vi / Wi
舉個例子:假設背包可容納50Kg的重量,物品信息如下:
物品 i 重量(Kg) 價值 單位重量的價值
1 10 60 6
2 20 100 5
3 30 120 4
按照我們的貪心策略,單位重量的價值排序: 物品1 > 物品2 > 物品3
因此,我們盡可能地多拿物品1,直到將物品1拿完之后,才去拿物品2.....
最終貪心選擇的結果是這樣的:物品1全部拿完,物品2也全部拿完,物品3拿走10Kg(只拿走了物品3的一部分!!!)
這種選擇獲得的價值是最大的。在(三)會給出證明。
而對於0-1背包問題,如果也按“優先選擇單位重量下價值最大的物品”這個貪心策略,那么,在拿了物品1和物品2之后,就不能在拿物品3了。因為,在拿了物品1和物品2之后,背包中已經裝了10+20=30Kg的物品了,已經裝不下物品3了(50-30 < 30)(0-1背包:一件物品要么拿,要么不拿,否能只拿一部分),此時得到的總價值是 160。而如果拿物品2和物品3,得到的價值為220。這說明,該貪心策略對0-1背包問題,不能求得最優解。
三,部分背包問題的貪心策略的正確性證明
貪心策略是:總是優先選擇單位重量下價值最大的物品
正確性證明 是:使用該貪心策略,可以獲得最優解。在這里,最優解就是帶走的物品價值最大。
證明思路:先考察一個全局最優解,然后對該解加以修改(一般是采用“剪枝”技巧),使其采用貪心選擇,這個選擇將原問題變成一個相似的、但是更小的問題。
先假設 物品集合S={W1,W2....Wn}已經按 單位重量價值從小到大排好序了。
並假設 一個全局最優解是:S(i)={Wi1,Wi2,.....Win}。Wi1,Wi2,.....Win是有序的。對於貪心選擇而言,總是會優先 選擇 Wn 的物品,當Wn 沒有后,再選擇Wn-1 .....
如果Win = Wn 問題已經得證。因為,我們的最優解S(i)中,已經包含了貪心選擇。只要繼續歸納下去,Wi(n-1) 就是 Wn-1 ....
如果Win != Wn 運用剪枝技巧,剪掉Win 並 貼上 Wn 此時,得到的是一個更優的解(因為價值更大了 ,Wn > Win)。因為,Wn 是單位重量價值最高的那個物品啊,我們的貪心選擇應該選擇它,但是這里的最優解S(i)卻沒有選擇它,於是我們用剪枝技巧,將它加入到S(i)中去,並把S(i)中的Win除去。
這就證明了,如果用貪心策略來進行選擇,得到的是最優解。從而證明了貪心算法的正確性。
其實,也就是證明了一定存在一個最優解,這個最優解就是由貪心選擇組成的。
四,參考資料
從 活動選擇問題 看動態規划和貪心算法的區別與聯系 文章中講到的 “活動選擇問題”的貪心策略的正確性證明。二者證明思路基本一致。
http://www.cnblogs.com/hapjin/p/5573419.html