多重背包问题的描述是 有N种物品 第i种物品有n[i]个
背包容积是V 求最大价值、
基本转移方程与多重背包相似 只不过数量有限:
f[i][v]=max(f[i-1][v],f[i-1][v-k*w[i]]+k*h[i])|k<=n[i]
转化为01背包问题 既把第i种物品变为n[i]种物品
对此还可以优化:把第i种物品分为若干件系数为k的物品 他们的cost和weight都是原来的k倍 因为任何一个整数都可以用2的次幂数的加和表示、
代码如下:
void duochong(int weight , int value , int amount)
{
if(weight*amount>=V)//如果满足 那么等价于完全背包问题
{
wanquan(int weight , int value);
}
return;
int k=1;
while(k<=num)
{
onezero(k*weight,k*value);
amount-=k;
k*=2;
}
onezero(amount*weight,amount*value);
}
背包容积是V 求最大价值、
基本转移方程与多重背包相似 只不过数量有限:
f[i][v]=max(f[i-1][v],f[i-1][v-k*w[i]]+k*h[i])|k<=n[i]
转化为01背包问题 既把第i种物品变为n[i]种物品
对此还可以优化:把第i种物品分为若干件系数为k的物品 他们的cost和weight都是原来的k倍 因为任何一个整数都可以用2的次幂数的加和表示、
代码如下:
void duochong(int weight , int value , int amount)
{
if(weight*amount>=V)//如果满足 那么等价于完全背包问题
{
wanquan(int weight , int value);
}
return;
int k=1;
while(k<=num)
{
onezero(k*weight,k*value);
amount-=k;
k*=2;
}
onezero(amount*weight,amount*value);
}