回溯 皇后 算法笔记_算法笔记-回溯法

(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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/467797.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Quartz集群

前言 前面说到过项目使用到了Quartz&#xff0c;当项目部署到多节点后&#xff0c;同样的调度任务会被重复执行&#xff0c;这时候就需要用到集群了。 集群配置 quartz.properties # # Configure Main Scheduler Properties # org.quartz.scheduler.instanceName me #ID设置为…

matalotlib(2)

文章目录注释文字Tex公式区域填充极坐标注释 import matplotlib.pyplot as plt import numpy as np xnp.arange(-10,11,1) yx*x plt.plot(x,y)plt.annotate(this is the bottom,xy(0,1),xytext(0,20),arrowpropsdict(facecolorr,frac0.2)) plt.show()文字 import matplotlib…

去华为吗?

昨晚的这条朋友圈很多人给我回复&#xff0c;支持去华为的人很多&#xff0c;但是也有几个反对的&#xff0c;一个说&#xff0c;怕是有命赚钱&#xff0c;没命花钱吧。还有一个说&#xff0c;自己拿到了华为offer&#xff0c;但是拒绝了&#xff0c;去了一个做开关电源的公司做…

plsql存过声明游标_plsql--游标用法

1.游标概念在 PL/SQL 块中执行 SELECT、INSERT、DELETE 和 UPDATE 语句时&#xff0c;ORACLE 会在内存中为其分配上下文区(Context Area)&#xff0c;即缓冲区。游标是指向该区的一个指针&#xff0c;或是命名一个工作区(Work Area)&#xff0c;或是一种结构化数据类型。它为应…

objectid.go源码阅读

/*http://docs.mongodb.org/manual/reference/object-id/ObjectId 按照字节顺序&#xff0c;一次代表&#xff1a;ObjectId is a 12-byte BSON type, constructed using:4个字节代表1970年元月一日到现在毫秒数 UNIX时间戳a 4-byte value representing the seconds since the …

实例

文章目录函数积分图散点条形图球员能力值函数积分图 import matplotlib.pyplot as plt import numpy as np from matplotlib.pyplot import Polygon def func(x):return -(x-2)*(x-8)40 xnp.linspace(0,10) yfunc(x) axplt.subplot() plt.plot(x,y,r,linewidth2)a2 b9 ax.set_…

闲来无事,拆个示波器玩玩。

首先要解释一下何为混合域示波器&#xff0c;既然说到这个话题就不得不说一下示波器进化史了&#xff0c;接下来大概讲一下示波器进化简史。第一代示波器——模拟示波器(ART-analog real time oscilloscope )纯模拟机器&#xff0c;使用示波管显示X-Y扫描成像显示波形&#xff…

r roc函数_R绘制ROC曲线 | Public Library of Bioinformatics

ROC曲线&#xff0c;受试者工作特征曲线 (receiver operating characteristic curve&#xff0c;简称ROC曲线)&#xff0c;又称为感受性曲线(sensitivity curve)。ROC曲线是根据一系列不同的二分类方式(分界值或决定阈)&#xff0c;以真阳性率(灵敏度)为纵坐标&#xff0c;假阳…

机器算法1)

SKLEARN Scikit-learn与特征工程 “数据决定了机器学习的上限&#xff0c;而算法只是尽可能逼近这个上限”&#xff0c;这句话很好的阐述了数据在机器学习中的重要性。大部分直接拿过来的数据都是特征不明显的、没有经过处理的或者说是存在很多无用的数据&#xff0c;那么需要…

老罗直播——只要给你一个机会,你就伸双手去接!

昨天&#xff0c;4月1日&#xff0c;罗永浩在抖音上直播卖货。一时间舆论纷纷&#xff0c;有吐槽老罗状况频出的&#xff0c;也有感叹老罗为了挣钱能屈能伸的。总之&#xff0c;有人讨论&#xff0c;有人关注&#xff0c;这个事件已经成功了一大半。老罗与抖音签约费是6000万&a…

segmenter.go

//Go中文分词package segoimport ("bufio""fmt""log""math""os""strconv""strings""unicode""unicode/utf8")const (minTokenFrequency 2 // 仅从字典文件中读取大于等于此频率的…

我在MTK平台下调试音频ALSA

#前言前言我就随便写了&#xff0c;因为是项目的需要&#xff0c;我需要在我们的MTK8167S平台上面调试音频。包括录音和播放。#硬件原理图因为是我们公司的项目&#xff0c;我就不能把完整的原理图给出来。因为两个MIC不涉及机密&#xff0c;跟MTK的公版是一样的。可以给出来大…

java 左边补0_java 数字左补齐0

NumberFormat nf NumberFormat.getInstance();//设置是否使用分组nf.setGroupingUsed(false);//设置最大整数位数nf.setMaximumIntegerDigits(2);nf.setMinimumIntegerDigits(2);//可以左补齐两位数的数字//以下是查询当前天数的所有日期String nowDaygetNowYMD();String curD…

一切不怕从零开始

不知道大家有没有看过吴京题为<<一切不怕从零开始>>的演讲。我曾经刷微博的时候看到过,印象和触动最深的是他的那句"我走过很多的路,换过很多的方向,不敢说有什么成就,到今天我觉得唯一能够让我拿出来炫耀的可能就是,我不害怕从头开始"。这样的话,对年龄…

60、二叉搜索树的第k个结点

一、题目 给定一颗二叉搜索树&#xff0c;请找出其中的第k大的结点。例如&#xff0c; 5 / \ 3 7 /\ /\ 2 4 6 8 中&#xff0c;按结点数值大小顺序第三个结点的值为4。 二、解法 1 package algorithm7;2 3 public class KthNode62 {4 public static void main(String[] ar…

机器学习算法3

文章目录转换器与估计器分类算法-K近邻算法一个例子弄懂k-近邻计算距离公式sklearn.neighborsMethodk近邻实例k-近邻算法案例分析对Iris数据集进行分割对特征数据进行标准化朴素贝叶斯概率论基础联合概率与条件概率联合概率条件概率如果每个事件相互独立拉普拉斯平滑sklearn朴素…

嵌入式杂谈之文件系统

文件系统可以说是嵌入式中的一大块&#xff0c;也是绕不过的一部分。之前我对文件系统认知一直停留在在U盘格式的理解上&#xff0c;直到接触了嵌入式Linux才发现这里面大有文章&#xff0c;以Linux启动挂载根文件系统为例&#xff0c;这个文件系统可以是真正的存储设备上的文件…

qtscrcpy自定义按键_按键映射说明.md

# 自定义按键映射说明按键映射文件为json格式&#xff0c;新增自己的按键映射文件需要放在keymap目录中才可以被QtScrcpy识别。按键映射文件的具体编写格式下面会介绍&#xff0c;也可以参考自带的按键映射文件。## 按键映射脚本格式说明### 通用说明- 按键映射中的坐标位置都是…

docker发布spring cloud应用

原文地址&#xff1a;http://www.cnblogs.com/skyblog/p/5163691.html 本文涉及到的项目&#xff1a; cloud-simple-docker&#xff1a;一个简单的spring boot应用 Docker是一种虚拟机技术&#xff0c;准确的说是在linux虚拟机技术LXC基础上又封装了一层&#xff0c;可以看成是…

Linux块设备IO子系统

块设备是Linux三大设备之一&#xff0c;其驱动模型主要针对磁盘&#xff0c;Flash等存储类设备&#xff0c;块设备&#xff08;blockdevice&#xff09;是一种具有一定结构的随机存取设备&#xff0c;对这种设备的读写是按块(所以叫块设备)进行的&#xff0c;他使用缓冲区来存放…