有n
nn種物品和乙個容量是v
vv的揹包。物品一共有三類:第一類物品只能用1
11次(0−1
0-10−
1揹包);第二類物品可以用無限次(完全揹包);第三類物品最多只能用s
is_i
si次(多重揹包);每種體積是v
iv_i
vi,價值是w
iw_i
wi。求解將哪些物品裝入揹包,可使物品體積總和不超過揹包容量,且價值總和最大。輸出最大價值。
輸入格式:
第一行兩個整數,n
nn,v
vv,用空格隔開,分別表示物品種數和揹包容積。接下來有n
nn行,每行三個整數vi,
wi,s
iv_i,w_i,s_i
vi,wi
,si
,用空格隔開,分別表示第i
ii種物品的體積、價值和數量。si=
−1
s_i=−1
si=−1
表示第i
ii種物品只能用1
11次;si=
0s_i=0
si=
0表示第i
ii種物品可以用無限次;s
i>
0s_i>0
si>
0表示第i
ii種物品可以使用s
is_i
si次;
輸出格式:
輸出乙個整數,表示最大價值。
資料範圍:
0
v≤ 1000 00v≤10 000 ,wi≤ 1000 00,wi ≤10 00− 1≤ si ≤1000 −1≤si≤1000 −1≤si≤ 1000 思路還是動態規劃,狀態表示是f[i ][j] f[i][j] f[i][j ],表示前i ii個物品裡選並且體積不超過j jj的最大價值,可以按照第i ii個物品選還是不選分類。對於si= −1 s_i=-1 si=−1 ,可以用0−1 0-10− 1揹包的方式遞推;對於si= 0s_i=0 si= 0,可以用完全揹包的方式遞推;對於s i> 0s_i>0 si> 0,可以用多重揹包的方式遞推,但是這裡需要加上二進位制優化,以防超時。參考: 1、0 −1 0-10− 1揹包: 2、完全揹包: 3、多重揹包二進位制優化版: **如下: using namespace std; const int n = 1010 ;int n, m; int f[n] ;int main() if(s) for( int j = m; j >= s * v; j-- ) f[j] =max (f[j] , f[j - s * v] + s * w);} } cout << f[m] << endl; return0; }時間複雜度o(v ((n− k)+∑ i=1k logsi )) o(v((n-k)+\sum _^k\log s_i)) o(v((n −k)+ ∑i=1 klogsi )),其中k kk是可以使用s is_i si次的物品種類數(即要二進位制優化的物品種類數),空間o(v )o(v) o(v) 。 題目描述 有 n 種物品和乙個容量是 v的揹包。物品一共有三類 每種體積是 vi,價值是 wi。求解將哪些物品裝入揹包,可使物品體積總和不超過揹包容量,且價值總和最大。輸出最大價值。輸入格式 第一行兩個整數,n,v,用空格隔開,分別表示物品種數和揹包容積。接下來有 n行,每行三個整數 vi,wi,s... 有 n 種物品和乙個容量是 v 的揹包。物品一共有三類 第一類物品只能用1次 01揹包 第二類物品可以用無限次 完全揹包 第三類物品最多只能用 si 次 多重揹包 每種體積是 vi,價值是 wi。求解將哪些物品裝入揹包,可使物品體積總和不超過揹包容量,且價值總和最大。輸出最大價值。輸入格式 第一行兩... 如果將p01 p02 p03混合起來。也就是說,有的物品只可以取一次 01揹包 有的物品可以取無限次 完全揹包 有的物品可以取的次數有乙個上限 多重揹包 應該怎麼求解呢?考慮到在p01和p02中給出的偽 只有一處不同,故如果只有兩類物品 一類物品只能取一次,另一類物品可以取無限次,那麼只需在對每個物...#include
AcWing 7 混合揹包問題
Acwing 混合揹包
混合揹包問題