資料結構整理目錄》
動態規劃(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 等人提出的,用來解決多階段決策過程問題的一種最優化方法。多階段決策過程是指把研究問題分成若干個相互聯絡的階段,由每個階段...