1. 程式人生 > >動態規劃基礎-----01背包(總結)

動態規劃基礎-----01背包(總結)

max 區別 求解 自己 pro 最優 背包問題 形式 bsp

1、動態規劃(DP)

  動態規劃(Dynamic Programming,DP)與分治區別在於劃分的子問題是有重疊的,解過程中對於重疊的部分只要求解一次,記錄下結果,其他子問題直接使用即可,減少了重復計算過程。
  另外,DP在求解一個問題最優解的時候,不是固定的計算合並某些子問題的解,而是根據各子問題的解的情況選擇其中最優的。
  動態規劃求解具有以下的性質:
  最優子結構性質、子問題重疊性質  
  最優子結構性質:最優解包含了其子問題的最優解,不是合並所有子問題的解,而是找最優的一條解線路,選擇部分子最優解來達到最終的最優解。
  子問題重疊性質:先計算子問題的解,再由子問題的解去構造問題的解(由於子問題存在重疊,把子問題解記錄下來為下一步使用,這樣就直接可以從備忘錄中讀取)。其中備忘錄中先記錄初始狀態。

2、求解思路

  ①、將原問題分解為子問題(子問題和原問題形式相同,且子問題解求出就會被保存);
  ②、確定狀態:01背包中一個狀態就是個物體中第個是否放入體積為背包中;
  ③、確定一些初始狀態(邊界狀態)的值;
  ④、確定狀態轉移方程,如何從一個或多個已知狀態求出另一個未知狀態的值。(遞推型)

3、01背包問題求解思路

  ①、確認子問題和狀態
  01背包問題需要求解的就是,為了體積V的背包中物體總價值最大化,件物品中第件應該放入背包中嗎?(其中每個物品最多只能放一件)
  為此,我們定義一個二維數組,其中每個元素代表一個狀態,即前個物體中若幹個放入體積為背包中最大價值。數組為:,其中表示前件中若幹個物品放入體積為的背包中的最大價值。

  ②、初始狀態
  初始狀態為和都為0,前者表示前0個物品(也就是空物品)無論裝入多大的包中總價值都為0,後者表示體積為0的背包啥價值的物品都裝不進去。

我自己寫的的沒保存,只能把這個整來湊數了

偽代碼

for(int t=1;t<=n;t++)
{
   for(int j=V;j>=v[t];j--)
   {
        dp[j]=max(dp[j],dp[j-v[t]]+w[t]);
    }
}

動態規劃基礎-----01背包(總結)