揹包問題總共有九種,0-1揹包式所有的基礎,所以首先研究0-1揹包:
一、0-1揹包
問題陳述:有n件物品和乙個容量為v的揹包。第i件物品的費用是w,價值是v。求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大若。
1、動態規劃解決
f[i,j]表示在前i件物品中選擇若干件放在承重為 j 的揹包中,可以取得的最大價值。
vi表示第i件物品的價值。
決策:為了揹包中物品總價值最大化,第 i件物品應該放入揹包中嗎 ?
題目描述:
有編號分別為a,b,c,d,e的五件物品,它們的重量分別是2,2,6,5,4,它們的價值分別是6,3,5,4,6,現在給你個承重為10的揹包,如何讓揹包裡裝入的物品具有最大的價值總和?
name
weight
value12
3456
78910
a260
6699
1212
151515b
2303
3669
991011c6
5000
6666
61011d
5400
0666
661010e4
6000
6666
666
只要你能通過找規律手工填寫出上面這張表就算理解了01揹包的動態規劃演算法。
首先要明確這張表是至底向上,從左到右生成的。
為了敘述方便,用e2單元格表示e行2列的單元格,這個單元格的意義是用來表示只有物品e時,有個承重為2的揹包,那麼這個揹包的最大價值是0,因為e物品的重量是4,揹包裝不了。
對於d2單元格,表示只有物品e,d時,承重為2的揹包,所能裝入的最大價值,仍然是0,因為物品e,d都不是這個揹包能裝的。
同理,c2=0,b2=3,a2=6。
對於承重為8的揹包,a8=15,是怎麼得出的呢?
根據01揹包的狀態轉換方程,需要考察兩個值,
乙個是f[i-1,j],對於這個例子來說就是b8的值9,另乙個是f[i-1,j-wi]+vi;
在這裡,
f[i-1,j]表示我有乙個承重為8的揹包,當只有物品b,c,d,e四件可選時,這個揹包能裝入的最大價值
f[i-1,j-wi]表示我有乙個承重為6的揹包(等於當前揹包承重減去物品a的重量),當只有物品b,c,d,e四件可選時,這個揹包能裝入的最大價值
f[i-1,j-wi]就是指單元格b6,值為9,pi指的是a物品的價值,即6
由於f[i-1,j-wi]+pi = 9 + 6 = 15 大於f[i-1,j] = 9,所以物品a應該放入承重為8的揹包
根據以上的描述,實現c++**:
int one_zero_pack(int** c,int _value, int _weight, char flag,int m, int n)
//memset(c, 0, sizeof(c));
memset(flag, 0, sizeof(flag));
for(int i = 1; i <= n; ++i)
else if(j >= _weight[i])
else
}} }
int i = n, j = m;
while (c[i][j] != 0)
} return c[n][m];
}int main()
int max_value = one_zero_pack(c, values, weights, flags, max_weight, number);
cout << "需要放入的物品如下" << endl;
for (int i = 1; i <= 3; i++)
cout << "總的價值為: " << max_value << endl;
return 0;
}
2014.0702
下次繼續總結。。。
演算法 揹包問題理解
不知道您是否知道揹包問題。做這個題可以幫助您更好地理解遞迴演算法。題的內容是 乙個揹包可以裝下重量為weight的物品,現在有n件物品的集合s,其中物品的重量分別是w0,w1,w2 wn 1,問是否有一種物品組合,使得其重量剛好等於weight.p.s 如果您沒做過這個題,建議您先自己思考下,然後再...
揹包問題的自己理解
public static void print int a system.out.println 完全的揹包問題 public static void comlete int v,int w,int c,int m for int j w n j c j 後面裝入的物品要根據前乙個裝入的價值判斷是...
揹包01問題初理解
揹包問題 knapsack problem 是一種組合優化的np完全問題。問題可以描述為 給定一組物品,每種物品都有自己的重量和 在限定的總重量內,我們如何選擇,才能使得物品的總 最高。問題的名稱 於如何選擇最合適的物品放置於給定揹包中。具體理解可以直接通過下面的例子來理解揹包問題 揹包問題的乙個例...