動態規劃演算法

2021-10-02 04:40:03 字數 2624 閱讀 4352

資料結構整理目錄》

動態規劃(dynamic programming)演算法的核心思想是:將大問題劃分為小問題進行解決,從而一步步取得最優解的處理演算法

動態規劃演算法與分治演算法類似,其基本思想也是將待求解問題分解成若干個子問題,先求解子問題,然後從這些子問題的解得到原問題的解

動態規劃問題可以通過填表的方式來逐步推進,得到最優解

每次遍歷到第i個物品,根據w[i]和v[i]來確定是否需要將該物品放入揹包中。即對於給定的n個物品,設v[i],w[i]分別為第i個物品的價值和重量,c為揹包的容量。再令v[ i] [ j]表示在前i個物品中能夠裝入容量為j的揹包中的最大價值,則我們有下面的結果:

v[i] [0]=v[0] [j] =0 //表示填入表第一行和第一列是0(把i個商品裝入到0磅揹包中,把0個商品裝入到j磅揹包中的價值 均為0)

當w[i]>j時;v[i] [j] = v[i-1] [j] //當準備新增商品的容量大於當前揹包的容量時,就直接使用上乙個單元格的裝入策略

當j>=w[i]時;v[i] [j] = max //當準備加入的新增的商品的容量小於當前揹包的容量;

​ v[i]表示當前商品的價值

​ v[i-1] [j-w[i]] 表示 (裝入i-1個商品到剩餘空間j-w[i](把當前商品扣除之後的乙個子問題)的最大值(使用到遞迴思想)

package l十大演算法.dynamic;

/** * @author zhou jian

* @date 2020 $ 2020/1/14 0014 15:19

* 揹包問題

*/public

class

knapsackproblem

;//物品的重量

int[

] val =

;//物品的價值。這裡de val[i]就是v[i]

int m =4;

//揹包的容量

int n = val.length;

//物品的個數

//建立二維陣列

//v[i][j]:在前乙個

int[

] v =

newint

[n+1

][m+1]

;//因為有一行為0,一列為0

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

int[

] path =

newint

[n+1

][m+1]

;//初始化第一行和第一列,在本程式中,可以不處理

for(

int i=

0;i)for

(int i=

0;i.length;i++

)//輸出v

for(

int i=

0;i) system.out.

println()

;}//根據前面得到的公式進行動態規劃處理

for(

int i=

1;i)else

//說明我們的i是從1開始的所以公式需要調整成

// v[i][j]= math.max(v[i-1][j],val[i-1]+v[i-1][j-w[i-1]]);

//為了記錄商品存放到揹包的情況,我們不能簡單的使用上面的公式,需要使用if...elese來體現公式

if(v[i-1]

[j]>=val[i-1]

+v[i-1]

[j-w[i-1]

])else}}

}//輸出v

for(

int i=

0;i) system.out.

println()

;}//輸出最後我們放入哪些商品

//遍歷path,這樣輸出會把所有的放入情況都得到,其實我們需要最後放入

// for(int i=0;i

// for(int j=0;j

// if(path[i][j]==1)

// system.out.printf("第%d個商品放入到揹包\n",i);

// }

// }

int i = path.length-1;

//行的最大下標

int j = path[0]

.length-1;

//列的最大下標

while

(i>

0&& j>0)

i--;}

}}

動態規劃演算法

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

動態規劃演算法

動態規劃 通過把原問題分解為相對簡單的子問題來求解複雜問題。動態規劃常常適用於有重疊子問題和最優子結構性質的問題。演算法總體思想 演算法的基本步驟 演算法的基本要素 最優子結構 重疊子問題 備忘錄方法 問題描述 子串行 公共子串行 最長公共子串行 lcs 問題 問題分析 動態規劃求解lcs問題 最長...

動態規劃演算法

動態規劃演算法的思路 動態規劃法即 dynamic programming method dp 是系統分析中的種常用方法。動態規劃法是20世紀50年代由貝爾曼 r.bellman 等人提出的,用來解決多階段決策過程問題的一種最優化方法。多階段決策過程是指把研究問題分成若干個相互聯絡的階段,由每個階段...