有n件物品,第i件物品的重量是w[i],它的價值是v[i],每件物品數量只有乙個,現在給你個承重為c的揹包,如何讓揹包裡裝入的物品具有最大的價值?
1. 暴力遞迴
遇到動態規劃問題寫不出來的話就寫暴力遞迴
int
maxprix
(vector<
int>
& w, vector<
int>
& v,
int c,
int i)
這個**跟簡單就不注釋了
2. 記憶化搜尋
在搜尋的過程中很會很多重複計算,所以我們把計算過的儲存在乙個陣列裡面,這就是記憶化,下面是記憶化搜尋的**:
int dp[60]
[60];
intmaxprix
(vector<
int>
& w, vector<
int>
& v,
int c,
int i)
就增加的三行**~依舊不寫注釋…哈哈!!
注:其實記憶化就已經是動態規劃了,只不過是遞迴版的
3. 動態規劃
首先分析上面的遞迴版,可以畫出如下的二維平面圖:
q:這個n和c是怎麼來的?
a:它兩就是遞迴函式的兩個可變引數
q:狀態轉移怎麼來的?
a:遞迴函式的每一層都代表乙個狀態,函式內呼叫的遞迴函式就是其它狀態,當前狀態就是由這些狀態轉移過來
所以寫出動態規劃的**:
int
binbackpack1
(vector<
int>
& w, vector<
int>
& v,
int c)
}return maxpix[n]
[c];
}
看起來是不是和遞迴很函式很像
4. 空間優化
我們可以並用使用二維陣列,而使用一維的陣列。
q:舉手:為什麼呢?
a:老師:從狀態轉移方程我們可以看出,當前狀態這和前一行的狀態(也就是當前物品的狀態只和前一物品的狀態有關),所以其他位置空間其實可以不用
q:舉手:老師!一維陣列的遍歷順序為啥是逆序的呢?
a:老師:你想想如果不逆序遍歷會發生什麼事情–由於空間是一維的陣列所以每次計算的結果都會被後面計算結果覆蓋掉
q:舉手:老師!恕我愚鈍,我還沒明白!
a:老師:別急,待為師給你畫個圖。
可以看出順序求和逆序求是不一樣的
注意:當前求解都是在上乙個狀態陣列中操作(也就是同乙個陣列,只不過裡面儲存的是上個狀態的資料)
來看看**:
//空間優化(一維陣列)
intbinbackpack
(vector<
int>
& w, vector<
int>
& v,
int c)
}return maxpix[c]
;}
ok這就是01揹包的全部內容,拜拜~ 動態規劃 01揹包與記憶化搜尋
動態規劃是一種高效的演算法。在數學和電腦科學中,是一種將複雜問題的分成多個簡單的小問題思想 分而治之。因此我們使用動態規劃的時候,原問題必須是重疊的子問題。運用動態規劃設計的演算法比一般樸素演算法高效很多,因為動態規劃不會重複計算已經計算過的子問題。因為動態規劃又可以稱為 記憶化搜尋 01揹包是介紹...
動態規劃 01揹包與記憶化搜尋
動態規劃是一種高效的演算法。在數學和電腦科學中,是一種將複雜問題的分成多個簡單的小問題思想 分而治之。因此我們使用動態規劃的時候,原問題必須是重疊的子問題。運用動態規劃設計的演算法比一般樸素演算法高效很多,因為動態規劃不會重複計算已經計算過的子問題。因為動態規劃又可以稱為 記憶化搜尋 01揹包是介紹...
動態規劃(一) 0 1揹包問題
1 題目描述 對於一組不同重量 不可分割的物品,我們需要選擇一些裝入揹包,在滿足揹包最大重量限制的前提下,揹包中物品總重量的最大值是多少呢?2 輸入 第一行是物品的個數n 1 n 100000 揹包容量w 1 w 1000000 第二行是n個物品的重量。3 輸出 輸出最大值 4 樣例輸入5 9 2 ...