關於揹包問題:
眾所皆知,這裡講給出關於揹包問題的一些簡介:
乙個旅行者準備隨身攜帶乙個揹包
. 可以放入揹包的物品有n 種
, 每種物品的重量和價值分別為 wj
, vj .
如果揹包的最大重量限制是 b,
怎樣選擇放入揹包的物品以使得揹包的價值最大?
題目就是這麼簡單:
先思考乙個問題:就是每種物品可以重複選擇,這種要怎麼解決:fk
(y):裝前
k 種物品
, 總重不超過
y, 揹包的最大價值;
這裡的子問題:很好理解,想一想,每一次你要去拿物品,你會想,
如果,只拿乙個物品並且包包還能裝下的最大價值是多少;
如果,要拿兩個物品並且包包能裝下的最大價值是多少;
。。。然而,如果不用動態規劃: 每一次,多拿乙個物品,就要從第乙個物品(前提是包包能裝下)去開始拿,,,,你不覺得,這是在做無用功嗎?
這個時候動態規劃就來了,可以做乙個備忘錄,記錄前面你已經拿過的價值,到某乙個物品的時候就可以直接將前面儲存的最大價值拿來用;
其實說是這麼說,真正的去理解遞推公式,還是有一點難的:v1
=1, v2
=3, v3
=5,v
4=9,
w1 =2, w2
=3, w3
=4, w4
=7,b
= 10fk
(y) 的計算表如下
:(利用遞推的公式:fk
int main11()//同乙個物品物品可以多次選擇;
memset(dp,0, sizeof(dp));
for(int i = 1;i<=n;i++)
}// for(int j = 0;j<=m;j++)
// cout <
遞推方程:f
k ( y)
= max
思路和上面的一模一樣;poj3624
//4 6
//1 4
//2 6
//3 12
//2 7
#include #include #define nn 3204
#define mm 12882
using namespace std;
int main()//同物品不能重選;
}cout << dp[n%2][m]<
動態規劃之0 1揹包問題(POJ3624)
有n件物品和乙個容積為m的揹包。第i件物品的體積w i 價值是d i 求解將哪些物品裝入揹包可使價值總和最大。每種物品只有一件,可以選擇放或者不放。n 3500,m 130000 解題思路 用f i j 表示取前i種物品,使它們總體積不超過j的最優取法取得的價值總和。遞推 f i j max f i...
POJ 3624 揹包問題
它這個問題問的是,在有限的容量下,能裝下的最大價值是多少。所以我們可以遞迴求解,記憶性遞迴,用二維陣列,但是這樣的話就會超記憶體,所以我們只能用動規來寫,而且不能開二維陣列,只能用滾動陣列。我們設乙個f陣列,大小為13000,它存的是容積為m的揹包可放下的最大價值。我們先假設乙個二維陣列f i j ...
POJ2184 動態規劃 01揹包
題意 某物 i 有兩種屬性值 s i 和 f i 每件物品可取或不取,求最後s f的最大值,同時保證s 0 且 f 0。s 為取出的 s i 的總和,f為取出的 f i 的總和 思路 1 涉及到取與不取的問題,很自然地想到了揹包。物品的價值 這個顯而易見,但是 揹包的容量 在 我們可以把兩個維度 t...