完全揹包 動態規劃

2021-07-02 14:30:10 字數 1865 閱讀 8066

描述

直接說題意,完全揹包定義有n種物品和乙個容量為v的揹包,每種物品都有無限件可用。

第i種物品的體積是c,價值是w。求解將哪些物品裝入揹包可使這些物品的體積總和不超過揹包容量,且價值總和最大。本題要求是揹包恰好裝滿揹包時,求出最大價值總和是多少。如果不能恰好裝滿揹包,輸出no輸入

第一行: n 表示有多少組測試資料(n<7)。 

接下來每組測試資料的第一行有兩個整數m,v。 m表示物品種類的數目,v表示揹包的總容量。(0輸出

對應每組測試資料輸出結果(如果能恰好裝滿揹包,輸出裝滿揹包時揹包內物品的最大價值總和。 如果不能恰好裝滿揹包,輸出no)

樣例輸入

2

1 52 2

2 52 2

5 1

樣例輸出

no

1

做這題之前必須先了解0-1揹包,並知道解題思路
0-1揹包的狀態轉移方程是
for i 

= 1 to n

for v

= v

to cif

[v] = max

完全揹包就是不限制物品使用個數,可以無限使用,也就是可以重複放置乙個物體

轉移方程

for 

i =

1 to

nfor

v = ci

to vf [

v] = max(f

[v], f [v

− ci] + wi

)

你會發現,這個偽**與01揹包問題的偽**只有v

的迴圈次序不同而已。 為什麼這個演算法就可行呢?首先想想為什麼01揹包中要按照v

遞減的次序來 迴圈。讓v

遞減是為了保證第i

次迴圈中的狀態f

[i, v

]是由狀態f

[i −

1, v − c

i]遞 推而來。換句話說,這正是為了保證每件物品只選一次,保證在考慮「選入 第i

件物品」這件策略時,依據的是乙個絕無已經選入第i

件物品的子結果f

[i −

1, v − c

i]。而現在完全揹包的特點恰是每種物品可選無限件,所以在考慮「加 選一件第i

種物品」這種策略時,卻正需要乙個可能已選入第i

種物品的子結 果f

[i, v − c

i],所以就可以並且必須採用v

遞增的順序迴圈。這就是這個簡單的 程式為何成立的道理。

還要補充一點關於d陣列初始化的問題,

因為題中要求必須完全裝滿揹包,也就是最後揹包剩餘體積為0才可以
所以我們初始化的d[0]  = 0;其他的都初始化為負無窮

完全揹包 動態規劃

題目 有n種物品和乙個容量為v的揹包,每種物品都有無限件可用。放入第i種物品的費用是ci,價值是wi,求解 將哪些物品裝入揹包,可使這些物品耗費的費用和不超過揹包容量,且價值總和最大。分析 一 建立狀態方程 可以轉化為01揹包問題求解 dp i v 表示前i件種物品放入容量為v的揹包的最大價值,則有...

動態規劃揹包問題 完全揹包

問題描述 有n種物品,每種均有無窮多個。第i個物品的體積為vi,重量為wi。選一些物品裝到容量為c的揹包中,使得揹包內物品在總體積不超過c的前提下重量盡量大。問題分析 開乙個陣列f i j 表示前i種物品中選取若干件物品放入剩餘空間為j的揹包中所能得到的最大重量。每種物品無窮個,所以還要有乙個k遍歷...

動態規劃 揹包問題 完全揹包

有n種物品和乙個容量為v的揹包,每種物品都有無限件可用。第i種物品的費用是w i 價值是v i 求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。貪心 y or n 因為每件物品都可以選取任意件,你也許會想到貪心演算法 選取價值最高的就好了 看上去沒什麼毛病,但是有乙個問題...