回溯法解0/1背包问题
2013-08-22 14:34 youxin 阅读(986) 评论(0) 编辑 收藏 举报我们前面说过,贪心算法用价值重量比对于可分割的背包问题是有效的,但对于0/1背包问题就无效的(0/1背包是不能分割,要就要,不要就不要)。本节用回溯法解0/1背包问题,求解过程如下:
在搜索过程中,尽量沿着左儿子节点前进,当不能沿着左儿子节点继续前进时,就得到问题的一个部分解,并把搜索转移到
右儿子子树。此时,估计由这个部分解所能得到的最大价值,把该值与当前的上界进行比较,如果高于当前的上界,就继续
由右儿子子树向下搜索,扩大这个部分解,直到找到一个可行解,最后把可行解保存起来,用当前可行解的值刷新目标函数的
上界,并向上回溯,寻找其他可能解;如果有部分所估计的最大值小于当前的上界,就丢弃正在搜索的部分解,直接向上回溯。
向上回溯有2种情况:如果当前阶段是左儿子分支节点,就转而搜索相应的右儿子分支节点;如果当前的节点是右儿子分支节点,
就沿着右儿子分支节点向上回溯,直到左儿子分支节点为止,然后再转而搜索相应的右儿子分支节点。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
2012-08-22 清除浮动(闭合浮动元素)方法总结
2012-08-22 css layout/fixed03: 2 column left navigation
2012-08-22 css layout/fixed02: 1 column top navigation
2012-08-22 css layout/fixed01/1 column no navigation
2012-08-22 css layout :center
2012-08-22 css :three column +top box
2012-08-22 css float浮动