//树状数组
#define lowbit(x) ((x)&(-x))
#define maxn ???
int an[maxn];
int getsum(int x)
{
int sum=0;
for(int i=x;i>0;i-=lowbit(i))
sum+=an[x];
return sum;
}
void update(int x,int v)
{
for(int i=x;i<=n;i+=lowbit(i))
{
an[x]+=v;
}
}
//01背包
for(int i=0;i<n;i++)
{
for(int j=w;j>=weight[i];j--)
{
dp[j]=max(dp[j],dp[j-weight[i]]+val[i]);
}
}
//完全背包
for(int i=0;i<n;i++)
{
for(int j=weight[i];j<=w;j++)
{
dp[j]=max(dp[j],dp[j-weight[i]]+val[i]);
}
}
//多重背包
for(int i=0;i<n;i++)
{
for(int k=1;k<=num[i];k++)
{
for(int j=k*weight[i];j<=w;j++)
{
dp[j]=max(dp[j],dp[j-k*weight[i]]+k*val[i]);
}
}
}
//二进制优化多重背包
for(int i=0;i<n;i++)
{
int k,j;
for(k=1;(k<<1)<num[i];k<<=1)
{
for(j=k*weight[i];j<=w;j++)
{
dp[j]=max(dp[j],dp[j-k*weight[i]]+k*val[i]);
}
}
k=num[i]-(k-1);
for(j=k*weight[i];j<=w;j++)
{
dp[j]=max(dp[j],dp[j-k*weight[i]]+k*val[i]);
}
}
树状数组 背包 模板
最新推荐文章于 2021-09-15 15:39:48 发布