用動態規劃求解0 1揹包問題

2021-06-17 17:01:10 字數 1282 閱讀 1244

0-1揹包問題描述:

有n件物品和乙個重量為m的揹包。(每種物品均只有一件)第i件物品的重量是w[i],價值是p[i]。求解將哪些物品裝入揹包可使價值總和最大。

動態規劃的基本思想:

將乙個問題分解為子問題遞迴求解,且將中間結果儲存以避免重複計算。通常用來求最優解,且最優解的區域性也是最優的。求解過程產生多個決策序列,下一步總是依賴上一步的結果,自底向上的求解。

動態規劃演算法可分解成從先到後的4個步驟:

1. 描述乙個最優解的結構,尋找子問題,對問題進行劃分。

2. 定義狀態。往往將和子問題相關的各個變數的一組取值定義為乙個狀態。某個狀態的值就是這個子問題的解(若有k

個變數,一般用k

維的陣列儲存各個狀態下的解,並可根    據這個陣列記錄列印求解過程。)。

3. 找出狀態轉移方程。一般是從乙個狀態到另乙個狀態時變數值改變。

4.以「自底向上」的方式計算最優解的值。

5. 從已計算的資訊中構建出最優解的路徑。(最優解是問題達到最優值的一組解)

其中步驟1~4是動態規劃求解問題的基礎,如果題目只要求最優解的值,則步驟5可以省略。

0-1揹包問題求解

用子問題定義狀態:即c[i][v]表示前i件物品恰放入乙個重量為m的揹包可以獲得的最大價值。則其狀態轉移方程便是:

c[i][m]=max

這個方程非常重要,基本上所有跟揹包相關的問題的方程都是由它衍生出來的。所以有必要將它詳細解釋一下:「將前i件物品放入重量為m的揹包中」這個子問題,若只考慮第i件物品的策略(放或不放),那麼就可以轉化為乙個只牽扯前i-1件物品的問題。如果不放第i件物品,那麼問題就轉化為「前i-1件物品放入容量為v的揹包中」,價值為c[i-1][m];如果放第i件物品,那麼問題就轉化為「前i-1件物品放入剩下的重量為m-w[i]的揹包中」,此時能獲得的最大價值就是c[i-1][m-w[i]]再加上通過放入第i件物品獲得的價值p[i]。

測試資料:

10,3

3,44,5

5,6**如下:

int pack(int m,int n,int *w,int *p)

for(int i = 0;i<

n+1;i++)  

c[i][0]=0;  

for(int j = 0;j<

m+1;j++)  

c[0][j]=0;   

for(int i = 1;i<

n+1;i++)else  

c[i][j] = c[i-1][j];  

}  }  

return c[n][m];  

}  

用動態規劃求解 0 1揹包問題

今天下午又把 0 1 揹包問題看了下,發現之前的寫法雖然答案正確,但是和動態規劃的思想相關度不大。不是想當然地從乙個二維陣列的 0 0 元素開始求解。直接放上 吧,因為已經寫得很詳細了。其中 weight 是儲存了每件物品重量的 vector,value 是儲存了每件物品價值的 vector,c 表...

01揹包問題 動態規劃求解

時間限制 1 sec 記憶體限制 128 mb 提交 48 解決 17 給定n種物品和乙個揹包,物品i的重量是wi,其價值為vi,問如何選擇裝入揹包的物品,使得裝入揹包的物品的總價值最大?在選擇裝入揹包的物品時,對每種物品i只能有兩種選擇,裝入或者不裝入,不能裝入多次,也不能部分裝入。第一行輸入物品...

0 1揹包問題,動態規劃求解

1.什麼是0 1揹包問題?有n個物品,它們有各自的體積和價值,現有給定容量的揹包,如何讓揹包裡裝入的物品具有最大的價值總和?舉例int v 每個物品對應的價值 int w 每個物品對應的重量 int bag 10 揹包最大承重10 0 1揹包問題 public static void main st...