問題引入
有 n
nn 組物品和乙個容量是 v
vv 的揹包
每組物品有若干個,同一組內的物品最多只能選乙個
每件物品的體積是 vi,
jv_
vi,j
,價值是 wi,
jw_
wi,j
,其中 i
ii 是組號,j
jj 是組內編號
求解將哪些物品裝入揹包,可使物品總體積不超過揹包容量,且總價值最大,輸出最大價值
狀態轉移
實際上多重揹包是分組揹包一種衍化版本,或者說多重揹包是特殊情況下的分組揹包
在多重揹包那裡,我們的主要想法是將s
ss個物品分成s
ss種物品,每種分別是1,2
,...
,s
1,2,...,s
1,2,..
.,s個物品,然後相當於這s
ss種物品為一組,我們選擇最優的一種
for
(int i=
1;i<=n;i++
)}
因此分組揹包也是這樣,只不過每一組的s
ss種物品已經給出,那麼我們直接列舉s
ss種物品進行狀態轉移即可
for
(int i=
1,s;i<=n;i++
)
注意這裡的
二、三重迴圈不能交換,因為如果交換了,假設當前列舉到了第j
jj個物品,相當於f(k
)f(k)
f(k)
轉移時的f(k
−w[p
])(1
≤p
f(k-w[p])(1 \leq p f( k−w[ p])( 1≤p可能是本組物品已經轉移後的狀態 注意到分組揹包不同於多重揹包,無法二進位制拆分或者單調佇列優化,只能列舉 例題傳送門#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define lowbit
(x)(x&
(-x)
)typedef long
long ll;
typedef unsigned long
long ull;
typedef pair<
int,
int>
p;const
double eps=
1e-8
;const
double pi=
acos(-
1.0)
;const
int inf=
0x3f3f3f3f
;const ll inf=
1e18
;const
int mod=
1e9+7;
const
int maxn=
2e5+10;
int n,m;
int f[maxn]
,v[maxn]
,w[maxn]
;int
main()
cout< } 分組揹包的理解請建立前幾講的基礎上。01揹包 完全揹包 多重揹包 混合揹包 二維揹包 有n件物品,分為若干組,現約束,在每組物品裡最多取一件物品放入揹包,每件物品的重量確定,價值確定,揹包容量確定,求在不超過揹包容量的情況下,可以存放的最大價值。首先判斷乙個分組當中的一件物品,同01揹包一樣,此物品... 有 n 組物品和乙個容量是 v 的揹包。每組物品有若干個,同一組內的物品最多只能選乙個。每件物品的體積是 vij,價值是 wij,其中 i 是組號,j 是組內編號。求解將哪些物品裝入揹包,可使物品總體積不超過揹包容量,且總價值最大。輸出最大價值。輸入格式 第一行有兩個整數 n,v,用空格隔開,分別表... 有 n 組物品和乙個容量是 v 的揹包。每組物品有若干個,同一組內的物品最多只能選乙個。每件物品的體積是 vij,價值是 wij,其中 i 是組號,j 是組內編號。求解將哪些物品裝入揹包,可使物品總體積不超過揹包容量,且總價值最大。輸出最大價值。輸入格式 第一行有兩個整數 n,v,用空格隔開,分別表...揹包九講之分組揹包問題
DP 揹包九講之分組揹包
揹包九講 6