資料結構與演算法 156 159 動態規劃

2021-10-13 20:09:01 字數 2133 閱讀 7796

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

物品重量

**吉他(g)

11500

音響(s)

43000

電腦(l)

32000

動態規劃演算法介紹

動態規劃演算法最佳實踐-揹包問題

物品重量

**吉他(g)

11500

音響(s)

43000

電腦(l)

32000

思路和**

v[i][0] = [0][j]=0;

當 w[i] > j時;v[i][j] = v[i-1][j]

當 j >= w[i] 時 ; v[i][j]=max

v[i][0] = [0][j]=0; //表示 填入表 第一行,第一列是0

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

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

//裝入的方式:

v[i-1][j]:就是上乙個單元格的裝入的最大值

v[i]:表示當前商品的** v[i-1][j-[wi]]:裝入 i - 1 商品,到剩餘空間 j - w[i] 的最大值

;//物品的價值 這裡的 val[i] 就是前面講的 v[i]

int[

] val =

;//揹包的容量

int m =4;

//物品的個數

int n = val.length;

//建立二維陣列,

//v[i][j] 表示 在前 i 個物品中能夠裝入容量為 j 的揹包中的最大價值。

int[

] v =

newint

[n +1]

[m +1]

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

int[

] path =

newint

[n +1]

[m +1]

;//初始化第一行和第一列

for(

int i =

0; i < v.length; i++

)for

(int i =

0; i < v[0]

.length; i++

)// arrays.fill(null, null);

//i = 1 不處理第一行

for(

int i =

1; i < v.length; i++

)else

else}}

}//輸出 v 看看情況

for(

int i =

0; i < v.length; i++

) system.out.

println()

;}system.out.

println()

;//輸出放入的商品

/* //這樣輸出會把所有的情況都得到,其實只需要最後的放入情況

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

}}*/

//先求出 path 行的最大下標

int i = path.length -1;

//求 path 列的最大下標

int j = path[0]

.length -1;

//從 path 陣列的最後開始找

while

(i >

0&& j >0)

i--;}

}}

資料結構與演算法 動態匹配演算法

如下 示例 package algorithm 動態匹配演算法解決揹包問題 public class packed int weight 表示揹包中的最大容量 int m 4 定義乙個二維陣列表示存放的最大 int v new int weight.length 1 m 1 定義乙個二維陣列來表示將...

演算法與資料結構 動態規劃

動態規劃 dp 的基本思想是 當前子問題的解可由上一子問題的解得出。動態規劃演算法通常基於由乙個遞推公式 狀態轉移方程 和若干個初始狀態 狀態 應用 1 lis longest increasing subsequence 求乙個陣列中的最長非降子串行的長度。子問題 我們可以考慮先求a 0 a 1 ...

演算法與資料結構 動態規劃

用遞迴求解問題時,反覆的巢狀會浪費記憶體。而且更重要的一點是,之前計算的結果無法有效儲存,下一次碰到同乙個問題時還需要再計算一次。例如遞迴求解 fibonacci 數列,假設求第 n 位 從 1 開始 的值,c 如下 include intfib int n return fib n 1 fib n...