部分揹包問題可以用貪心演算法求解,且能夠得到最優解。
貪心策略是什麼呢?將物品按單位重量 所具有的價值排序。總是優先選擇單位重量下價值最大的物品。
單位重量所具有的價值: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的一部分!!!)
這種選擇獲得的價值是最大的。
貪心策略是:總是優先選擇單位重量下價值最大的物品
正確性證明 是:使用該貪心策略,可以獲得最優解。在這裡,最優解就是帶走的物品價值最大。
證明思路:先考察乙個全域性最優解,然後對該解加以修改(一般是採用「剪枝」技巧),使其採用貪心選擇,這個選擇將原問題變成乙個相似的、但是更小的問題。
先假設 物品集合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除去。
這就證明了,如果用貪心策略來進行選擇,得到的是最優解。從而證明了貪心演算法的正確性。
其實,也就是證明了一定存在乙個最優解,這個最優解就是由貪心選擇組成的。
部分揹包問題的貪心演算法正確性證明
一,部分揹包問題介紹 首先介紹下0 1揹包問題。假設一共有n件物品,第 i 件物品的價值為 vi 重量為wi,乙個小偷有乙個最多只能裝下重量為w的揹包,他希望帶走的物品越有價值越好,請問 他應該選擇哪些物品?0 1揹包問題的特點是 對於某件 更適合的說法是 某類 物品,要麼被帶走 選擇了它 要麼不被...
部分揹包問題的貪心演算法正確性證明
一,部分揹包問題介紹 首先介紹下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...