演算法 揹包 誤認為貪心的陷阱

2022-09-20 03:18:06 字數 924 閱讀 8448

有n件物品,第i件物品(i = 1,2,3…n)的價值是vi, 重量是wi,我們有乙個能承重為m的揹包,我們選擇一些物品放入揹包,每樣只能放乙個,顯然放入揹包的總重量不超過m。我們要求選擇物品的總價值最大,請問如何選擇?這裡我們假設所有出現的數都是正整數。

揹包問題如果沒有認真理解的話,第一種思路應該會往貪心的方面思考。

比如先以物品貴重程度排序,先選比較貴重的。

然而對於資料:

n = 3, m = 3

v = (2,2,3)

w = (1,2,3)

按照先選貴重物品的策略,會先選擇價值為3的那個,並且揹包裝滿了,但是如果我們選取前兩個物品,總價值可以達到4。

如果按照價效比排序:

對於資料

n = 3, m = 7

v = (2,3,4)

w = (3,4,5)

按這種方法因為2/3 < 3/4 < 4 / 5,我們先選擇第三件物品,但是選了它之後別的東西放不下了!總價值是4,但如果我們選擇前兩件物品可以拿到總價值5。

造成這種現象的原因是貪心的原則為:通過每一步的最優解推導出整體的最優解,然而對於揹包問題,因為每一步取或者不取的最優解取決於整體,也就是「動態」的。所以,揹包問題成為了乙個經典的動態規劃問題。

再看一道部分揹包問題

乙個旅行者有乙個最多能裝m公斤的揹包,然後又n重物品,它們的重量和價值分別為w[i],c[i],問旅行者能獲得的最大價值

這一題便是貪心問題,因為我們可以一直選價效比高的直到填滿,所以是否貪心取決於每種物品是否只取走一部分。

而揹包問題又衍生出了很多變形,動態規劃的方法也不盡相同,所以需要多加練習才能掌握這一題型。

演算法 貪心演算法(揹包問題)

給定n 個物品和乙個容量為 c的揹包,物品 i的重量是 wi,其價值為 vi,揹包問題是如何選擇入揹包的物品,使得裝入揹包的物品的總價值最大,注意和 0 1揹包的區別,在揹包問題中可以將物品的一部分裝入揹包,但不能重複裝入。用貪心法求解揹包問題的關鍵是如何選定貪心策略,使得按照一定的順序選擇每個物品...

揹包問題(貪心演算法)

揹包問題 程式8 4 2.cpp 定義控制台應用程式的入口點。揹包問題 貪心演算法 include stdafx.h define maxnumber 20 typedef struct node object float find object wp,int n,float m i 0 while...

貪心演算法 揹包問題

詳細見原帖 我寫的是自己的感悟 揹包問題 有乙個揹包,揹包容量是m 150。有7個物品,物品可以分割成任意大小。要求盡可能讓裝入揹包中的物品總價值最大,但不能超過總容量。物品 a b c d e f g 重量 35 30 60 50 40 10 25 價值 10 40 30 50 35 40 30 ...