揹包問題:有乙個揹包,容量為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...