九大揹包問題專題 完全揹包問題(詳解,最優解)

2021-10-05 13:01:28 字數 1546 閱讀 1168

和01揹包問題的區別:

01揹包問題:1件物品只能選或者不選

完全揹包問題:1件物品可以重複選多次,只要不超過總體積

題目:

問題:有n件物品和乙個容量是v的揹包。

第i件物品的體積是vi,價值是wi。

求解將哪些物品裝入揹包,可使這些物品的總體積不超過揹包的容量,且價值最大。

輸入格式

第一行有兩個整數,n,v用空格隔開,分別表示物品數量和揹包容積。

接下來有n行,每行兩個整數vi,wi,用空格隔開,分別表示第i件物品的體積和價值。

輸出格式

輸出乙個整數,表示最大價值

資料範圍

0輸入樣例

4 51 2

2 43 4

4 5輸出樣例

10分析思路:

f[i]:表示總體積是i的情況下,最大價值是多少

f[0…m]列舉,m表示揹包容量

result=max

01揹包從大到小列舉->保證每個物品只用1次

從前往後考慮

for(int i=0;i

(由於j正序,f[j-kv[i]]為前i-1個物品的值,f[j-k*v[i]-v[i]]為前i個物品的值).

最後會傳遞到max處。

因為f[v[i]]一定正確(2中已假設前i-1個物品中的f[j]全都正確),f[0]一定正確=0,w[i]一定正確,所max

一定正確=>f[j-k*v[i]]一定正確=>f[j]一定正確.

時間複雜度:1000000

**:

#include

#include

#include

using

namespace std;

const

int n=

1010

;int n,m;

int f[n]

;int

main()

/*初始化的時候把所有的 f[i]都初始化為0

/f[m] 表示體積 小於等於m的情況下 ,所有方法裡面

/轉移的時候不一定是從f[0]轉移過來的,可以從任意乙個狀態轉移

/當用不完整個揹包的容量的時候 ,假設剩k容量就可以從k轉移

/則一定可以列舉到 最優解一樣的選法 ,因為體積變成了一樣的

/假設最優解用了m-k的體積,f[m]就一定可以從k開始列舉 ,也只用了 m-k的體積

也會列舉到最優解 ,所以f[m]表示的就是體積小於等於 m的情況下的最優解 */

cout<

<

//最大價值(不需要列舉從0到m)

若題目問體積恰好為m的情況下,最大價值為多少?

除f[0]=0

在初始化時所有f[i]初始化為負無窮

九大揹包問題專題 分組揹包問題

問題 有n組物品和乙個容量是v的揹包。第組物品有若干個,同一組內的物品最多只能選乙個每件物品的體積是vij,價值是wij。其中i是組號,j是組內編號。求解將哪些物品裝入揹包,可使這些物品的總體積不超過揹包的容量,且價值總和最大。輸出最大價值 輸入格式 第一行有兩個整數,n,v用空格隔開,分別表示物品...

揹包問題(完全揹包)

1.矩陣鏈乘法 2.投資組合問題 3.完全揹包問題 4.01揹包問題 5.最長公共子串行 乙個揹包,可以放入n種物品,物品j的重量和價值分別為,如果揹包的最大重量限制是b,怎麼樣選擇放入揹包的物品以使得揹包的總價值最大?組合優化問題,設表示裝入揹包的第j個物品的數量,解可以表示為。那麼目標函式和約束...

揹包問題(0 1揹包 完全揹包)

0 1揹包 有n件物品和乙個容量為v的揹包。第i件物品的費用是c i 價值是w i 求解將哪些物品裝入揹包可使價值總和最大。重要的點在於 每種物品僅有一件,可以選擇放 不放子問題 f i v 表示前i件物品恰好放入乙個 容量為v 的揹包可以獲得的最大價值。狀態轉移方程 遞推式 f i v max 考...