動態規劃 (01揹包 poj3624 )

2021-08-11 14:47:16 字數 1448 閱讀 7741

關於揹包問題:

眾所皆知,這裡講給出關於揹包問題的一些簡介:

乙個旅行者準備隨身攜帶乙個揹包

. 可以放入揹包的物品有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...