演算法 動態規劃演算法

2021-09-26 20:28:58 字數 2581 閱讀 1926

包問題:有乙個揹包,容量為

4磅 , 現有如下物品:

物品

重量

**吉他(

g) 1

1500 音響

(s) 4

3000 電腦

(l) 3

2000

1)要求達到的目標為裝入的揹包的總價值最大,並且重量不超出

2)要求裝入的物品不能重複

動態規劃的核心思想是把原來的問題分解成子問題進行求解,也就是分治的思想。但是與分治法不同的地方在於,分治法在子問題和子子問題上被重複計算了很多次,而動態規劃則具有記憶性,通過填寫表把所有已經解決的子問題答案紀錄下來,在新問題裡需要用到的子問題可以直接提取,避免了重複計算,從而節約了時間。

揹包問題主要是指乙個給定容量的揹包、若干具有一定價值和重量的物品,如何選擇物品放入揹包使物品的價值最大。其中又分

01揹包和完全

揹包(完全揹包指的是:

每種物品都有無限件可用

),上面這套題指出裝入的物品不能重複,屬於01揹包。

設w[i]為第i個商品的重量,v[i]為第i個商品的價值,c為揹包的容量,物品的總個數為n。每次遍歷到的第i個物品,根據w[i]和v[i]來確定是否應該將物品放入到揹包當中。令v[

i][j]

表示在前i個物品

中能夠裝入容量為 

j 的揹包中的最大價值。

假設存在揹包容量大小分為1,2,3,4的各種容量的揹包(分配容量的規則為最小重量的整數倍):

物品

0

1

2

3

40

0 0

0 0

吉他(g) 0

1500(g)

1500(g)

1500(g)

1500(g)

音響(s) 0

1500(g)

1500(g)

1500(g)

3000(s)

電腦(l) 0

1500(g)

1500(g)

2000(l)

3500(lg)

1.第一行是什麼商品都沒有,因此不管揹包的容量有多大,價值都為0。第一列全為0的原因是如果揹包的容量是0的話,那麼揹包裡面就裝不下任何的東西。

2.假如現在只有吉他,這時不管揹包容量多大,只能放入一把吉他。這樣第二行就可以都填入1500。

3.假如有結他和音箱,揹包小於4磅是放不下音箱的,所以前3個只能只放結他,揹包容量是4時只放音箱的價值最大。

4.電腦的重量是3,那麼揹包容量小於3時只能放把結他,容量是3時只放電腦的價值最高,容量為4時可以只放音箱,價值為3000,或者放乙個電腦加把結他,價值3500,所以這個價值最高。

驗證 i = 1, j = 1 :

w[i] = w[1] = 1

w [1] = 1  j = 1  

v[i][j]=max :

v[1][1] = max = max = 1500

驗證 i = 3;

j = 4 :

w[i] = w[3] =3 j = 4

j = 4 >= w[i] = 3 => 4 >= 3

v[3][4] = max = max = 2000+1500

public class packet ;  //物品的重量

int val = ; //物品的價值

int m = 4; //揹包的容量

int n = val.length; //物品的個數

//建立二維陣列,表示在前i個物品中能夠裝入容量為 j 的揹包中的最大價值

int v = new int[n+1][m+1];

//第一行和第一列設定為0

for(int i=0; i < v.length; i++)

for(int i=0; i< v[0].length; i++)

//為了記錄放入商品的情況,定義乙個二維陣列

int path = new int[n+1][m+1];

//動態規劃

for(int i=1; i< v.length; i++) else else }}

} //輸出當前陣列的值

for(int i=0; i < v.length; i++)

system.out.println();

} int i = path.length - 1; //行的最大下標

int j = path[0].length -1; //列的最大下標

while (i>0 && j>0)

i--;

} }}

演算法 動態規劃演算法

動態規劃法基本思想 將原問題分解為相似的子問題,在求解的過程中通過子問題的解求出原問題的解。著名的應用例項有 求解最短路徑問題,揹包問題,專案管理,網路流優化等。個人對動態規劃的理解,主要就是避免重複計算。就是那些曾經發生過的事情,曾經計算過的值先儲存下來,然後再次遇到相同的子問題的時候,直接用儲存...

演算法 動態規劃演算法

動態規劃法基本思想 將原問題分解為相似的子問題,在求解的過程中通過子問題的解求出原問題的解。著名的應用例項有 求解最短路徑問題,揹包問題,專案管理,網路流優化等。個人對動態規劃的理解,主要就是避免重複計算。就是那些曾經發生過的事情,曾經計算過的值先儲存下來,然後再次遇到相同的子問題的時候,直接用儲存...

動態規劃演算法

一 動態規劃演算法原理 將待求解的問題分解成若干個相互聯絡的子問題,先求解子問題,然後從這些子問題的解得到原問題的解 對於重複出現的子問題,只在第一次遇到的時候對它進行求解,並把答案儲存起來。了不去求解相同的子問題,引入乙個陣列,把所有子問題的解存於該陣列中,這就是動態規劃所採用的基本方法。動態規劃...