int v,j; //v:总容量
int dp[Maxv]; //c:体积 w:价值 n:数量
void zobag(int c,int w)//01背包
{
for(j=v;j>=c;j--)
dp[j]=Max(dp[j],dp[j-c]+w);
}
void combag(int c,int w)//完全背包
{
for(j=c;j<=v;j++)
dp[j]=Max(dp[j],dp[j-c]+w);
}
void multibag(int c,int w,int n)//多重背包
{
if(c*n>v) //当物品的总容量大于背包的总容量时,相当于完全背包
combag(c,w);
else //转换为01背包,二进制思想优化(例:13可以分为 1(2^0)、2(2^1)、4(2^2)、6,因为1、2、4、6这四个数可以组合成1—13中的所有数字)
{
int k=1;
while(k<n)
{
zobag(c*k,w*k);
n-=k;
k*=2;
}
zobag(c*n,w*n);
}
}
背包问题模板
最新推荐文章于 2022-03-02 22:39:48 发布