經典演算法詳解 之 揹包演算法

2021-09-01 06:13:03 字數 2578 閱讀 9098

揹包問題(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 分析 揹包問題是關於最...