生活随笔
收集整理的這篇文章主要介紹了
动态规划过程
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
動態規劃過程
應用背包問題:分享一下
有一個背包,容量是4磅,現有如下產品
1)要求達到的目標為裝入的背包的總價值最大,并且要求重量不能超出
2) 要求轉入的物品不能重復
思路分析:算法其實是模型建立的過程
- 分析 建模的過程:
- 橫向房物品的重量,從0~4磅
- 縱向是放的物品
第一層,只能放一個吉他
第二層,能放吉他和音響
第三層,吉他,音響和電腦 - 依據建模過程,進行背包填表如下圖:
- 設計 一個二維數組,i 為行數表示第幾行,j為列(表示裝入的重量)如上圖所示:設計第一行,和第一列為0 不放入任何東西;
- 聲明 w[i] ,val[i] 分別表示 第i個物品的重量和價值
w[i] 表示物品的重量 ,代碼映射 int [] w={1,3,4},int[] val[]={1500,3000,2000}; - int [][] v 變量存放 每個表格存放物品的最大價值
分析得出模型 - 構建算法模型,注意考慮!臨界條件(邊界條件)
條件 :w[i]>j 時 v[i][j]= v[i-1][j]
w[j]<=j 時 v[i][j] =max(v[i-1],v[i]+v[i-1][j-w[i]])
算法的思想: 利用動態規劃來解決,每次遍歷第i個物品,根據 w[i],v[i] 來決定是否放入到背包中。01問題(只能添加一次,要么有,要么沒有)
代碼后續補上;
在這里插入代碼片
下面展示一些 內聯代碼片。
package acm;/*** @author qxl*/
public class KnapsackProblem {public static void main(String[] args) {knapsack();}public static void knapsack(){// 背包的重量int [] w={1,4,3};//背包物品的價值int [] val={1500,3000,2000};//表格為4列int n=w.length;//表格有5列int m=val.length;int[][] v=new int[n+1][m+2];//表格初初始化,依據分析初始化 表格 第一行和第一列都為空// 二維數組 v.length 一維數組存放,每個行一維數組的地址for(int i=0;i<v.length;i++){v[i][0]=0;}// v[0].length 列數for(int i=0;i<v[0].length;i++){v[0][i]=0;}//遍歷打印推演的價值表格for(int i=0;i<v.length;i++){for(int j=0;j<v[0].length;j++){System.out.print(v[i][j]+" ");}System.out.println();}// 分析出的模型: 當w[i]>j v[i]=v[i-1][j] 注意!!理解 j-w[i] 求出 放入當前行物品后,剩余的重量;i-1 表示當前行上一行// w[i]<=j v[i]=max{v[i-1][j],v[i]+v[i-1][j-w[i]]}// O(n^2) 的時間復雜度//注意 第一行和第一列都為0 因此循環從第一個值開始for(int i=1;i<v.length;i++){//體現是思想,建模過程中涉及到的問題for(int j=1;j<v[0].length;j++){// 注意!! w 和val 從下標1開始的,這里要注意了 都要進行 i-1;if(w[i-1]>j){v[i][j]=v[i-1][j];}else{// 由于遍歷是從1開始的 因此 w[i]<=j 時候 v[i]= max{v[i-1][j],val[i-1]+v[i-1][j-w[i-1]]} 其中注意! val[i-1]// w[i-1] 主要是循環下標從1 開始的;v[i][j]= Math.max(v[i-1][j],val[i-1]+v[i-1][j-w[i-1]]);}}}//遍歷打印推演的價值表格for(int i=0;i<v.length;i++){for(int j=0;j<v[0].length;j++){System.out.print(v[i][j]+" ");}System.out.println();}}
}
總結
以上是生活随笔為你收集整理的动态规划过程的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。