背包相关问题总结
至多与恰好
如果问恰好装,则初始化。二维则初始化。(这样就能是那些能够恰好装满背包的物品的值为正数,而那些不能恰好装满背包的物品的值就为负数。)
如果问至多装,则初始化。
一定要注意,要求恰好时,分组背包枚举某一组的元素之前,要再设。(的值要够小!)
二维时(要求恰好),最开始的也可能要设(除了第一次时)
01背包和完全背包枚举顺序
01背包是倒序,完全背包是顺序。
(若倒序枚举,只会一直减小,所以我们总是用第个阶段向第个阶段转移,是01背包。如果是正序,那么有可能被更新。增大到时,又可能被更新。这时两个都处于第个阶段的状态之间发生了转移,相当于第个物品被使用了两次,是完全背包。)
分组背包枚举顺序
先枚举是哪个组,再倒序枚举体积,最后再枚举每组组内元素。
(注意枚举顺序。是阶段,与共同构成状态,而是决策。)
多重背包枚举顺序
思想:转化为共有个物品的01背包问题(是每种物品的个数)。
先枚举是哪种物品,再枚举的个数,最后再倒序枚举体积,做01背包dp[k] = max(dp[k], dp[k - w[i]] + c[i])
。
注意res = max{dp[0 ~ v]}
二进制拆分法(优化多重背包)
原来的多重背包时间复杂度是的,效率较低。
我们可以把数量为的第种物品拆成个物品(是满足的最大整数)。
它们的体积分别为()。
那么这个物品可以且只能凑成之间所有能被整除的数,这等价于原问题中体积为的物品可以使用次。这时的复杂度是。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】