多重背包模板
多重背包:
- 有N种物品和一个容量为V的背包。第i种物品最多有numi件可用。
- 每件物品的重量是wi,价值是vi。
- 求解将哪些物品装入背包可使这些物品的重量总和不超过背包容量,且价值总和最大。
const int maxn = 100005;
int w[maxn], v[maxn], num[maxn];//w:重量 v:价值 num:数量 // w: weight, v:value, num:number
int dp[maxn];
int V; //V:容量
//01背包
void ZeroOnePack(int w, int v)
{
for (int j = V; j >= w; j--)
{
dp[j] = max(dp[j], dp[j - w] + v);
}
}
//完全背包
void CompletePack(int w, int v)
{
for (int j = w; j <= V; j++)
{
dp[j] = max(dp[j], dp[j - w] + v);
}
}
//多重背包
void MultiplePack(int w, int v, int num)
{
if (w * num >= V)
{
CompletePack(w, v);
}
else
{
int k = 1;
while (k < num)
{
ZeroOnePack(k*w, k*v);
num -= k;
k <<= 1;
}
Z