(1)0-1背包问题

思路:构造一个二叉树,每个商品都有两种状态,要或者不要。如果要就在这个节点的左枝挂子节点,如果不要就在右节点挂子节点。如果全部商品都分配完状态之后就回溯,回溯到一个还有其他选择的节点,接着往这个选择发展节点,然后再回溯,然后再往下。。。。  直到无路可走,就结束了。

假如限制重量是10,总共有四个商品,重量分别是2, 5, 4, 2 价格分别是6, 3, 5, 4。第一轮的路程如5-11图,第1个商品要,第2个商品要,第3个商品发现装不下了,所以到第3个节点只能走右节点,并且第3个节点的左节点成为死节点,没有发展下去的可能了。第4个商品要,此时已经给所有的商品赋予状态了(要或者不要),记录下此时所有商品的价值和,记为最优价格。接着就开始回溯,如5-13,从节点5先是回溯到节点4(此时购物车有1,2,3选择不要,4肯定是要的,所以没必要再发展4节点的右节点),再到节点3(节点三的左节点是死节点),再到节点2,节点2的右节点是可选的,然后接着按照刚开始的逻辑接着往下走就可以了,等继续走完这一轮,计算最优值,更新下最优值,然后再回溯。。。

剪枝:如果按照上面的逻辑,其实几乎相当于遍历了所有的可能性。如果有4个商品,就会有2的4次方种可能,有些不可能是最优结果的分支直接就剪掉就可以了,比如,如果按照上面的逻辑是会有:1不要2不要3不要4不要这个分支。所以如果发现背包可以把剩下的商品都装入的情况,就直接给剩余的商品赋值为要就可以了。当1不要2不要的时候,3和4可以都装入背包,直接都要就可以了。没必要再走3不要的分支(直接设置成死节点)。或者也可以判断就算把剩余的都加进包里,总价值也小于当前最优值,当前这条路也没必要走了。

        

代码:

1 <?php2 $w = [2, 5, 4, 2];3 $v = [6, 3, 5, 4];4 $current = getNode(0);5 $count = count($w);6 list($limit, $best, $cw, $cp, $bestMap, $map) = [10, 0, 0, 0, array(), array()];7 $noBack = true;8

9 while (1) {10 $node = getNode($current->level + 1, $current);11 if ($current->level < $count && $noBack) {12 if ($best >= array_sum(array_slice($v, $current->level)) + $cp) {13 $current->l = false; //剪枝

14 $current->r = false;15 $noBack = false;16 } elseif (is_object($current->l)|| $current->l === false) {17 $node->dir = 0; //这种情况是回溯回来的,直接发展右节点就可以了

18 $current->r = & $node;19 } elseif ($cw + $w[$current->level] <= $limit) {20 $cw += $w[$current->level]; $cp += $v[$current->level];21 $node->dir = 1; //1代表左枝,0代表右枝

22 $current->l = & $node; //这种情况代表背包可以装下,所以挂在左节点

23 $map[$current->level] = 1;24 } else{25 $node->dir = 0;26 $current->r = & $node;27 $current->l = false; //这种情况代表装不下,左节点是死节点,发展右节点

28 }29 $current = & $node;30 } else { //走完一轮,开始回溯

31 if ($cp > $best) { //记录最优值

32 $best = $cp; $bestMap = $map;33 }34 while (1) { //开始回溯

35 $deal = isset($current->dir) ? $current->dir : 0;36 $current = & $current->p;37 if ($current === null) {38 break 2; //到头了,结束

39 }40 if (isset($map[$current->level])) {41 unset($map[$current->level]);42 $cw -= $w[$current->level] * $deal; //怎么加的,怎么减回去

43 $cp -= $v[$current->level] * $deal;44 }45 if ($current->l === null || $current->r === null) { //存在活结点

46 $noBack = true;47 break;48 }49 }50 }51 unset($node);52 }53

54 function getNode($level, & $p = null) {55 $node = newstdClass();56 $node->level = $level; $node->p = & $p;57 $node->l = null; $node->r = null;58 return $node;59 }60

61 print_r([‘map‘ => $bestMap, ‘val‘ => $best]);

原文:https://www.cnblogs.com/wangjianheng/p/11857435.html

回溯 皇后 算法笔记_算法笔记-回溯法相关推荐

  1. 回溯 皇后 算法笔记_什么叫回溯算法,一看就会,一写就废

    什么叫回溯算法 对于回溯算法的定义,百度百科上是这样描述的:回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就"回溯"返回, ...

  2. python快速排序算法循环_算法:快速排序的Python实现

    一.概述 快速排序(quick sort)是一种分治排序算法.该算法首先 选取 一个划分元素(partition element,有时又称为pivot):接着重排列表将其 划分 为三个部分:left( ...

  3. python枚举算法流程图_算法-枚举

    本章我们进入算法的学习,我们会通过比较经典的例题去讲解一些常用的算法思想,常用的算法思想包括:枚举.递归.分治.贪心.试探.动态迭代和模拟等,本节我们来学习一下枚举算法. 1. 枚举思想 枚举算法我们 ...

  4. 回溯 皇后 算法笔记_算法笔记_04_回溯

    设计思想: (1)适用:求解搜索问题和优化问题. (2)搜索空间:数,节点对应部分解向量,可行解在树叶上. (3)搜索过程:采用系统的方法隐含遍历搜索树. (4)搜索策略:深度优先,宽度优先,函数优先 ...

  5. 连通域最小外接矩形算法原理_算法|图论 2W字知识点整理(超全面)

    作者:SovietPower✨ 链接:https://ac.nowcoder.com/discuss/186584 来源:牛客网 度数序列 对于无向图, 为每个点的度数.有 (每条边被计算两次).有偶 ...

  6. andrew ng 机器学习笔记_所有笔记目录 | 数据分析 | 机器学习 | 深度学习等

    持续更新中... 机器学习模型Python复现: 舟晓南:感知机模型python复现 - 随机梯度下降法:梯度下降法:adagrad:对偶形式 舟晓南:k近邻(KNN)模型python复现 - 线性扫 ...

  7. 排序中减治法算法伪代码_算法浅谈——分治算法与归并、快速排序(附代码和动图演示)...

    在之前的文章当中,我们通过海盗分金币问题详细讲解了递归方法. 我们可以认为在递归的过程当中,我们通过函数自己调用自己,将大问题转化成了小问题,因此简化了编码以及建模.今天这篇文章呢,就正式和大家聊一聊 ...

  8. 退火算法 贪婪算法_算法贪婪策略简介

    退火算法 贪婪算法 介绍 (Introduction) The solution is determined by a sequence of steps each step has given a ...

  9. 求n的阶乘的算法框图_算法|从阶乘计算看递归算法

    欢迎点击「算法与编程之美」↑关注我们! 本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章. 1 理解递归 "程序设计是实践计算机思维的重要手段& ...

最新文章

  1. vsearch2.8.1使用和命令简介——中文帮助文档(免费64位版usearch)
  2. Linux下Redis-3.0.7版本的安装以及Redis主备的部署(一)
  3. HTTPSConnectionPool(host=‘files.pythonhosted.org‘, port=443): Read timed out的解决方法
  4. Go语言入门——dep入门
  5. java的多态性学习代码
  6. c primer plus第六版电子版_【财经】京东超市PLUS有机联盟:有机品牌提升一站式营销解决方案...
  7. MySQL安装失败问题
  8. mysql+linux+无法启动服务无法启动不了_Linux实例中MySQL服务常见的无法启动或启动异常处理...
  9. java数据结构编写二叉树_java 数据结构与算法 BinaryTree二叉树编写
  10. python struct pack string_python struct pack fmt格式
  11. 计算机机房规范管理,学校计算机机房如何有效科学规范管理
  12. 解决:地址 localhost:8080 已在使用中
  13. 计算机无法安装VC2015,win7系统vc++2015一个或多个问题导致了安装失败的处理步骤...
  14. 到了2017还在苦等房价下跌的人,你们可以醒醒了!
  15. java min函数_Java Math min()用法及代码示例
  16. 网页前端上传文件,后端接受并处理文件
  17. 百度 android 笔试题库,百度科目一考试题库
  18. 川土微电子|高速高性能RS-485/422收发器系列
  19. 锐起无盘精华100问!(包括3.1,3.0版本)
  20. 第八天 Python爬虫之Rquests库打码平台的简单使用

热门文章

  1. 鹰眼拓扑锁定跟踪 网络管理一目了然
  2. 搞懂静态变量static
  3. 网络爬虫--18.python中的GIL(全局解释器锁)、多线程、多进程、并发、并行
  4. Oracle高可用概述(HA与RAC的关系解惑)
  5. java swingworker_Java中的SwingWorker
  6. Python 第三方模块之 psutil - 获取系统运行的进程和系统利用率信息
  7. dev gridview 打印列数过多_R语言:如何将多张统计图绘制在一张上面
  8. 浅析“高斯白噪声”,“泊松噪声”,“椒盐噪声”的区别
  9. 莒南机器人_莒南42项重点建设项目公布!一定有你关注的
  10. 那些我曾经犯过的低级编程错误