我是靠谱客的博主 长情心情,最近开发中收集的这篇文章主要介绍树状数组 背包 模板,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

//树状数组
#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]);
}
}

最后

以上就是长情心情为你收集整理的树状数组 背包 模板的全部内容,希望文章能够帮你解决树状数组 背包 模板所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(61)

评论列表共有 0 条评论

立即
投稿
返回
顶部