矩陣連乘和0-1揹包問題的動態規劃演算法
一、實驗目的
本次實驗是針對動態規劃演算法運用的演算法設計及應用練習,旨在加深學生對該部分知識點的理解,提高學生運用該部分知識解決問題的能力。
三、 實驗專案
請用動態規劃法對下列問題進行求解。題目(4選2):
四、實驗過程
(一)題目一:矩陣連乘問題
題目分析
給定由n個矩陣構成的序列{a1,a2,…,an},對乘積a1a2…an,找到最小化乘法次數的加括號方法。
演算法構造
在此論證演算法設計中的一些必要的設計依據。
以k為位置劃分:
for(k=i;k<=j-1;k++)
; int p = ;//兩組資料做測試
//p[i]的含義有兩層指的是:
//1. 第i個矩陣的列
//2. 第i+1個矩陣的行
int m = new int [p.length+1][p.length+1];//記錄連乘次數
int s = new int [p.length+1][p.length+1];//記錄最佳分割位置
matrixchain(p,m,s);
system.out.println("矩陣計算量最小次數矩陣");
printmatrixmul(m,p.length);
system.out.println("相對於m矩陣的最優斷開位置矩陣s");
printmatrixmul(s,p.length);
system.out.println("乘法的最優次序:");
traceback(s,1,p.length-1);
}private static void printmatrixmul(int m,int n) }}
public static void matrixchain(int p,int m,int s)
for(int r = 2; r<= p.length;r++)
else
x[i]=0;
演算法實現
程式源**(請寫入必要的注釋)。
package com.cn;
public class package ;
int p = ;
int c = backpack_solution(m, n, w, p);
system.out.println(「揹包的最大容量為10」);
system.out.println(「商品數量為3」);
system.out.println(「商品重量陣列為」);
system.out.println(「商品價值陣列為」);
system.out.println(「結果如下:」);
for (int i = 1; i <=n; i++) }}
}public static int backpack_solution(int m, int n, int w, int p) else
c[i][j] = c[i - 1][j];}}
return c;
}執行結果
經驗歸納
如果第i個物品的重量小於揹包的容量,則會有以下兩種情況:v(i,j)=v(i-1,j) jwi如果第i個物品沒有裝入揹包,則揹包中物品價值就等於把前i-1個物品裝入容量為j的揹包中所取得的價值。
五、實驗總結
矩陣連乘問題和0-1揹包問題都用到了動態規劃法,其實就是子問題重疊最優,每乙個子問題都是最優的。矩陣連乘問題的關鍵是要確定括號所加的位置並且找到連乘次數最少的那個結果並進行疊加,0-1揹包問題中的物品要麼裝要麼不裝,所以就會出現不同的情況,要進行判斷,找出子問題最優的裝法並進行疊加。
動態規劃揹包問題 01揹包
問題描述 n種物品,每種乙個。第i種物品的體積為vi,重量為wi。選一些物品裝到容量為c的揹包,使得揹包內物品不超過c的前提下,重量最大。問題分析 宣告乙個f n c 的陣列。f i j 表示把前i件物品都裝到容量為j的揹包所獲得的最大重量。當 j v i 時,揹包容量不足以放下第 i 件物品,f ...
動態規劃 揹包問題 01揹包
有n種物品和乙個容量為v的揹包,每種物品僅用一次。第i件物品的費用是w i 價值是v i 求解將哪些物品裝入揹包可使價值總和最大。例如 n 5,v 10 重量 價值 第乙個物品 10 5 第二個物品 1 4 第三個物品 2 3 第四個物品 3 2 第五個物品 4 1 首先我們考慮貪心策略,選取最大價...
0 1揹包問題和揹包問題
1 0 1揹包問題 0 1揹包問題可做如下描述 給定n種物品和乙個揹包,每個物品有乙個 wi,vi 對,表示其重量和價值。揹包的總容量為c。對於每個物品,要麼裝要麼不裝 0或1 現在需要設計方案使得揹包內的物品的總價值最大。演算法如下 0 1揹包問題可以使用動態規劃來解決。d i j 表示考慮第i件...