揹包問題(knapsackproblem)是一種組合優化的
np完全問題
。問題可以描述為:給定一組物品,每種物品都有自己的重量和**,在限定的總重量內,我們如何選擇,才能使得物品的總**最高。
這個問題涉及到了兩個條件:一是物品總的大小小於或等於揹包的大小,二是物品總的價值要盡量大。
如果我們
用子問題定義狀態
來描述的話可以這樣解釋:
用f[i][v]表示前i件物品恰放入乙個容量為v的揹包可以獲得的最大價值。
用公式表示:
f[i][v]=max
或f[v]=max
具體的解釋可以理解為
將前i件物品放入容量為v的揹包中,
現只考慮第i件物品的策略(放或不放),那麼就可以轉化為乙個只
涉及前i-1件物品和第i
件物品的問題。
如果不放第i件物品,那麼問題就轉化為「前i-1件物品放入容量為v的揹包中」,價值為f[i-1][v];如果放第i件物品,那麼問題就轉化為「前i-1件物品放入剩下的容量為v-c[i]的揹包中」,此時能獲得的最大價值就是f[i-1][v-c[i]]再加上通過放入第i件物品獲得的價值w[i]。(v
表示揹包的最大容量,
c[i]
表示第i
件物品的大小,
w[i]
表示第i
件物品的價值)
演算法如下:
class fruit
public string getname()
public int getprice()
public int getsize()
}public class knapsack;
for(int i=0;ivalue[s])
}} system.out.println("物品\t**");
for(int i=max;i>min;i=i-fruits[item[i]].getsize())
system.out.println("合計\t"+value[max]);
}}
程式執行的過程如下:
i=0時
,放入李子 揹包
負重 12
3456
78s-
--45
678p
---0
1234
value00
04500
4500
4500
4500
9000
item--
-000
00i=1時
,放入蘋果 揹包
負重 12
3456
78s-
---5
678p
----
0123
value00
04500
5700
5700
5700
9000
item--
-011
10 i=
2時,放入橘子 揹包
負重 12
3456
78s-
2345
678p
-012
3456
value
02250
2250
4500
5700
6750
7950
9000
item-2
2012
20 i=
3時,放入士多啤梨 揹包
負重 12
3456
78s1
2345
678p
0123
4567
value
1100
2250
3350
4500
5700
6800
7950
9050
item32
3013
23 i=
4時,放入甜瓜 揹包
負重 12
3456
78s-
----
678p
----
-012
value
1100
2250
3350
4500
5700
6800
7950
9050
item32
3013
23由最後乙個**可以知道,在揹包負重
8的時候,最多得到價值
9050
的水果,這個時候可以得到裝入的水果是
3號水果士多啤梨,那麼剩下的(
8-1=7
)個大小空間,可以知到為
2號水果也就是橘子,同理下一步可以知道放入的水果是
1號水果蘋果。此時獲得的最優解的價值就是
9050
,放入的水果是士多啤梨、橘子和蘋果。
到此,我們的揹包問題已經解決,要了解上述演算法,需要讀者分析出揹包演算法中的每一步都做了什麼操作,這一點可以通過上述的**看出,希望本文對讀者理解揹包演算法有所幫助!
經典演算法詳解 之 揹包演算法
揹包問題 knapsackproblem 是一種組合優化的 np完全問題 問題可以描述為 給定一組物品,每種物品都有自己的重量和 在限定的總重量內,我們如何選擇,才能使得物品的總 最高。這個問題涉及到了兩個條件 一是物品總的大小小於或等於揹包的大小,二是物品總的價值要盡量大。如果我們 用子問題定義狀...
經典演算法之 揹包問題
問題描述 有乙個揹包容量為m,一堆物品其重量表示為w 物品相應的價值v 現在要求將物品中的一部分或全部,放入揹包。要求 裝入物品的總價值最高 同時滿足裝入物品總重量不超過m 對單個物品而言,狀態可為 裝入揹包 不裝入揹包 一部分裝入揹包。假設裝入的物品為從w i 到w j 則有 對於完全揹包而言,我...
PHP經典演算法之揹包問題
問題 假設有乙個揹包的負重最多可達8公斤,而希望在揹包中裝入負重範圍內可得之總價物品,假設是水果好了,水果的編號 單價與重量如下所示 1 栗子 4kg 4500 2 蘋果 5kg 5700 3 橘子 2kg 2250 4 士多啤梨 1kg 1100 5 甜瓜 6kg 6700 分析 揹包問題是關於最...