【笔记】二进制拆分
二进制拆分
二进制拆分是对多重背包的一种优化方式,可以极大的优化多重背包的时间。
前置
我们回顾下完全背包问题。
背包容积为
常规做法是将其转化成01背包来做,将
时间复杂度为:
二进制拆分依旧是将完全背包转化为01背包,不过是将
时间复杂度为:
原理
一个数可以被拆分为任意二进制的和。
例如:
任意一个数都可以表示为几个
正常将完全背包转移成01背包时,我们从小到大枚举放j个第
为什么呢?
例如: 我们先将
我们在背包的时候考虑将
例如:我们将
这样我们就可以通过将
代码实现
点击查看代码
for (int i=1;i<=n;++i) {
v[i]=read(); w[i]=read(); k[i]=read();
for (int j=1;j<=k[i];j<<=1) {
V[++tot]=v[i]*j; W[tot]=w[i]*j;
k[i]-=j;
}
if (k[i]) {
V[++tot]=v[i]*k[i]; W[tot]=w[i]*k[i];
}
}
for (int i=1;i<=tot;++i) {
for (int j=C;j>=V[i];--j) {
dp[j]=max(dp[j],dp[j-V[i]]+W[i]);
}
}
例题:
洛谷P1782 传送门
补充:
若遇到求方案可行性的多重背包,可以用 bitset 将二进制拆分进一步优化。
利用bitset的位移实现快速转移。总时间复杂度会变成
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧