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

2021-09-22 09:37:12 字數 2123 閱讀 9317

一,部分揹包問題介紹

首先介紹下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=已經按 單位重量價值從小到大排好序了。

並假設 乙個全域性最優解是:s(i)=。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除去。  

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

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

四,參考資料

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

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

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

部分揹包問題可以用貪心演算法求解,且能夠得到最優解。貪心策略是什麼呢?將物品按單位重量 所具有的價值排序。總是優先選擇單位重量下價值最大的物品。單位重量所具有的價值 vi wi 舉個例子 假設揹包可容納50kg的重量,物品資訊如下 物品 i 重量 kg 價值 單位重量的價值 1 10 60 6 2 ...

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

一,部分揹包問題介紹 首先介紹下0 1揹包問題。假設一共有n件物品,第 i 件物品的價值為 vi 重量為wi,乙個小偷有乙個最多只能裝下重量為w的揹包,他希望帶走的物品越有價值越好,請問 他應該選擇哪些物品?0 1揹包問題的特點是 對於某件 更適合的說法是 某類 物品,要麼被帶走 選擇了它 要麼不被...

部分揹包問題 貪心演算法

有n個商品,每個商品的重量為wi,為 pi,現有乙個揹包,最多能裝 的重量 其中 0 i 問 怎樣裝能使包中裝入的商品價值最高 對於每個商品可以只裝該商品的一部分 include stdio.h include iostream include stdlib.h define maxsize 100...