ACWing 3 完全揹包問題

2021-10-19 12:00:37 字數 1533 閱讀 2205

有n

nn種物品和乙個容量是v

vv的揹包,每種物品都有無限件可用。第i

ii種物品的體積是v

iv_i

vi​,價值是w

iw_i

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

輸入格式:

第一行兩個整數,n

nn,v

vv,用空格隔開,分別表示物品種數和揹包容積。接下來有n

nn行,每行兩個整數vi,

wi

v_i,w_i

vi​,wi

​,用空格隔開,分別表示第i

ii種物品的體積和價值。

輸出格式:

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

資料範圍:

0 ≤n

,v

≤1000

0\le n, v\le 1000

0≤n,v≤

1000

0 ≤v

i,wi

≤1000

0\le v_i,w_i\le 1000

0≤vi​,

wi​≤

1000

思路是動態規劃。設f[i

][j]

f[i][j]

f[i][j

]是只允許選前i

ii個物品,並且總重量不超過j

jj的情況下,能得到的最大價值。那麼所有方案可以分為兩類,不含第i

ii個物品和含第i

ii個物品,若不含第i

ii個物品,那就相當於只從前i−1

i-1i−

1個物品,最大價值就是f[i

−1][

j]

f[i-1][j]

f[i−1]

[j];若含第i

ii個物品,最大價值就是f[i

][j−

vi]+

wi

f[i][j-v_i]+w_i

f[i][j

−vi​

]+wi

​。則有:f[i

][j]

=min

⁡f[i][j]=\min\

f[i][j

]=min我們可以優化空間。可以發現f[i

][j]

f[i][j]

f[i][j

]只會用到其上和左邊的值,所以可以只開一行陣列,然後每輪都從左向右更新。**如下:

#include

using

namespace std;

const

int n =

1010

, v =

1010

;int v[n]

, w[n]

;int f[v]

;int

main()

時間複雜度o(n

v)

o(nv)

o(nv

),空間o(v

)o(v)

o(v)

acwing 3 完全揹包問題

有 n 種物品和乙個容量是 v 的揹包,每種物品都有無限件可用。第 i 種物品的體積是 vi,價值是 wi。求解將哪些物品裝入揹包,可使這些物品的總體積不超過揹包容量,且總價值最大。輸出最大價值。輸入格式 第一行兩個整數,n,v,用空格隔開,分別表示物品種數和揹包容積。接下來有 n 行,每行兩個整數...

AcWing 3 完全揹包問題

題目描述 解題思路 與01揹包問題解法 相似 01揹包問題 與01揹包問題不同點 1 每件物品可以在揹包容量足夠的情況下無限制拿取。2 最大價值不一定在list n m 上需要對list的第m列排序。時間複雜度 o n n 源 include include includeusing namespa...

AcWing 3 完全揹包問題

樸素做法 會超時 includeusing namespace std const int n 1010 int n,m int v n w n int f n n int main f i j 需要更新的情況 選 k k 可以為 0 個第 i 個物品,前提是能夠裝得下 k 個第 i 個物品,也就是...