部分背包問題的貪心算法正確性證明


一,部分背包問題介紹

首先介紹下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 並 貼上 W此時,得到的是一個更優的解(因為價值更大了 ,Wn > Win)。因為,Wn 是單位重量價值最高的那個物品啊,我們的貪心選擇應該選擇它,但是這里的最優解S(i)卻沒有選擇它,於是我們用剪枝技巧,將它加入到S(i)中去,並把S(i)中的Win除去。  

這就證明了,如果用貪心策略來進行選擇,得到的是最優解。從而證明了貪心算法的正確性。

其實,也就是證明了一定存在一個最優解,這個最優解就是由貪心選擇組成的。

 

四,參考資料

 從 活動選擇問題 看動態規划和貪心算法的區別與聯系 文章中講到的 “活動選擇問題”的貪心策略的正確性證明。二者證明思路基本一致。

http://www.cnblogs.com/hapjin/p/5573419.html

 

某種 找換硬幣問題的貪心算法的正確性證明

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM