動態規劃演算法

2022-07-06 15:54:11 字數 2921 閱讀 7908

簡單理解:在一些分治演算法解決的問題中,需要將較大規模的問題轉化為較小規模的問題,往往會用到遞迴。但是在一些問題中,遞迴的小問題被多次重複運算,浪費了效能,因此可以使用陣列或者其他合適的方式將運算過的小規模問題的結果記錄下來,再運算小規模的問題時先看是不是已經運算過了,沒有運算過再去運算並將結果儲存,所以一般分治演算法都是從大規模問題開始遞迴運算,不斷將問題規模變小,而動態規劃演算法則一般從小規模問題開始運算,每次運算分解出的小規模問題都是已經運算過的。如此便使用了儲存空間換取了運算時間,減小了時間複雜度。

二.01揹包問題

1.窮舉法

可以先不考慮揹包,考慮被拿走的物品的所有組合情況,n個物品有2n種拿法(每個物品都可以選擇拿或者不拿),然後再判斷每一種拿法是否能放入揹包,能放入揹包的情況下計算總價值並比較出最大價值。

static void main(string args)

;//記錄物品價值的陣列,和重量陣列對應,物品價值分別是4、5、6

int p = ;

//呼叫exhaustivity函式得到7kg的揹包放置物品的最大價值

console.writeline(exhaustivity(9 , w, p));

console.readkey();

}/// /// 計算給定的mkg揹包放置物品的最大價值

///

/// 給定的物品重量

/// 記錄所有物品重量的陣列

/// 記錄所有物品對應**的陣列

/// 揹包中放置物品的最大價值

public static int exhaustivity(int m,int w,int p)

}//判斷是否超重,不超重的情況下判斷**是不是大於最大**,如果是更新最大**

if (weighttotal <= m && pricetotal > maxprice)

maxprice = pricetotal;

}//返回最大**

return maxprice;

}/// /// 通過按位與運算得到給定物品number在給定放入情況i中是否放入揹包

///

/// 給定的物品放入情況

/// 給定的物品編號

2.分治演算法(自上而下分解問題)

這個問題的分治演算法的核心是將物品逐個放入揹包,有以下幾種情況:

1)揹包沒有剩餘重量了

2)物品太重,無法放入揹包

3)物品的編號為0,即所有的物品都試過了

4)物品還可以放入揹包

在第4)種情況下,有兩種情況,一種放入物品得到的**最大,一種不放入物品得到的**最大(因為放入物品後背包的剩餘可放入重量也變小了,所以放入當前物品對後續物品能否放入的情況有影響,因此不一定是將當前物品放入得到的總**最高,需要實際求解並判斷),因此需要進行比較得到最大**

static void main(string args)

;//記錄物品價值的陣列,和重量陣列對應,物品價值分別是4、5、6

int p = ;

console.writeline(updown(9, w.length - 1, w, p));

console.readkey();

}/// /// 根據揹包剩餘重量和物品編號計算放入物品能獲得最大價值還是不放入物品能獲得最大價值

///

/// 揹包剩餘能裝的重量

/// 當前放入揹包的物品編號

/// 記錄所有物品重量的陣列

/// 記錄所有物品**的陣列

/// 放入揹包的物品的最大**

3.改進分治演算法,使用陣列記錄已經運算過的問題結果

//定義乙個規則二維陣列記錄結果,行數對應揹包重量,列數對應放入的物品個數,值對應這種情況揹包中的最大重量

public static int[,] result = new int[11, 4];

static void main(string args)

;int p = ;

console.writeline(updown(9, w.length - 1, w, p));

console.readkey();

}public static int updown(int m,int i,int w,int p)

}

4.動態規劃演算法(自下而上計算問題)

static void main(string args)

;int p = ;

console.writeline(bottomup(9, w.length - 1, w, p));

console.readkey();

}//記錄運算結果的陣列,行數代表揹包重量,列數代表物品編號

public static int[,] result = new int[11, 4];

/// /// 計算指定重量m的揹包種放置前i個物品放置的最大價值

///

/// 揹包重量

/// 物品編號

/// 記錄所有物品重量的陣列

/// 記錄所有物品**的陣列

///

public static int bottomup(int m,int i,int w,int p)}}

//自下而上計算完成後,返回重量為m的揹包放入i個物品的最大**即可

return result[m, i];

動態規劃演算法

一 動態規劃演算法原理 將待求解的問題分解成若干個相互聯絡的子問題,先求解子問題,然後從這些子問題的解得到原問題的解 對於重複出現的子問題,只在第一次遇到的時候對它進行求解,並把答案儲存起來。了不去求解相同的子問題,引入乙個陣列,把所有子問題的解存於該陣列中,這就是動態規劃所採用的基本方法。動態規劃...

動態規劃演算法

動態規劃 通過把原問題分解為相對簡單的子問題來求解複雜問題。動態規劃常常適用於有重疊子問題和最優子結構性質的問題。演算法總體思想 演算法的基本步驟 演算法的基本要素 最優子結構 重疊子問題 備忘錄方法 問題描述 子串行 公共子串行 最長公共子串行 lcs 問題 問題分析 動態規劃求解lcs問題 最長...

動態規劃演算法

動態規劃演算法的思路 動態規劃法即 dynamic programming method dp 是系統分析中的種常用方法。動態規劃法是20世紀50年代由貝爾曼 r.bellman 等人提出的,用來解決多階段決策過程問題的一種最優化方法。多階段決策過程是指把研究問題分成若干個相互聯絡的階段,由每個階段...