您的位置:首页 > 其它

背包问题模板

2016-05-08 21:57 239 查看
转载至此链接

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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dp