回溯算法_ BackTracking
目前还存在的疑问:
1. 所谓的该分支满足条件之后就回退到上一层节点,可是加谁呢? x[i+1] ??
加到 N, 不满足target sum条件就返回上一级(同时改变上一级数为 i+1...纵向继续从 i+1 加到++ N中间有满足的sum就返回组合,没有就一直加到N 自动结束,结束后再返回上一级 i+1。。。。。)
2. 可以通过提前排序的方法来优化这个算法
we can improve the above algorithm by strengthening the constraint checks and presorting the data;By sorting the initial array, we need not to consider rest of the array, once the sum so far is greater than target number. We can backtrack and check other possibilities.
3. Geek案例用的是后续遍历?
post order traversal
总感觉 37行这里不对:不应该是减去 sum - s[ite], 应为在 47行加过 1 了 i+1 ?????????????????????????
38行这个 唯一的return我表示很费解?他前面的递归调用函数怎么走呢???
我一定要在java代码里把下面改为ite-1 否则怎么都解释不通:




对的,因为 ite 和 i+1就是再同一个参数位置:



1. 看上图好像只有subset sum 符合条件采取增加节点:ite 而且直接return了,不再继续找子集?
2. 关于这可二叉树的解释:
2.1
n the above tree, a node represents function call and a branch represents candidate element.
从下图可以看出来,横向是把s里的元素挨个走一遍,depth纵向是不断增加 subset里的元素个数,直到把set 里的所有元素都加入subset,即使我们知道越加越大已经超过了 target sum

if( target_sum == sum )
{
// We found subset
printSubset(t, t_size);
// Exclude previously added item and consider next candidate,减去这个符合条件的元素,再选后面的元素肯定就不止俩元素了
subset_sum(s, t, s_size, t_size-1, sum - s[ite], ite + 1, target_sum); //ite+1就是第二层横向扩节点?是不是每多一个节点就进行下一个子集组合
return;
}
我理解这是退回上一层, subset size退回上一级,可是元素s[i] 是怎么挪动的?如下图理解:

下图i+1有疑问:我就是认为这个t_size不应该+1 , 因为刚才已经回退了一层呀??!!不对我理解错了,人家这样是对的;
我的新发现:那就是横向和纵向扩展其实都是在加s[i], 也就是s 里所有的元素都要试一遍,加到最后一个元素。注意那个for循环,我所考虑的,如果一个分支加到最后一个元素还是得不到target sum,那么就结束了for循环, 也不输出什么,也不return.....随着循环的结束而结束程序。。。

回溯算法_ BackTracking的更多相关文章
- Java求解迷宫问题:栈与回溯算法
摘要: 使用栈的数据结构及相应的回溯算法实现迷宫创建及求解,带点JavaGUI 的基础知识. 难度: 中级 迷宫问题是栈的典型应用,栈通常也与回溯算法连用. 回溯算法的基本描述是: (1) 选择一个 ...
- 回溯算法——解决n皇后问题
所谓回溯(backtracking)是通过系统地搜索求解问题的方法.这种方法适用于类似于八皇后这样的问题:求得问题的一个解比较困难,但是检查一个棋局是否构成解很容易. 不多说,放上n皇后的回溯问题代码 ...
- LeetCode37 使用回溯算法实现解数独,详解剪枝优化
本文始发于个人公众号:TechFlow,原创不易,求个关注 数独是一个老少咸宜的益智游戏,一直有很多拥趸.但是有没有想过,数独游戏是怎么创造出来的呢?当然我们可以每一关都人工设置,但是显然这工作量非常 ...
- LeetCode46 回溯算法求全排列,这次是真全排列
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode的26篇文章,我们来实战一下全排列问题. 在之前的文章当中,我们讲过八皇后.回溯法,也提到了全排列,但是毕竟没有真正写 ...
- LeetCode通关:连刷十四题,回溯算法完全攻略
刷题路线:https://github.com/youngyangyang04/leetcode-master 大家好,我是被算法题虐到泪流满面的老三,只能靠发发文章给自己打气! 这一节,我们来看看回 ...
- 3、回溯算法解题套路框架——Go语言版
前情提示:Go语言学习者.本文参考https://labuladong.gitee.io/algo,代码自己参考抒写,若有不妥之处,感谢指正 关于golang算法文章,为了便于下载和整理,都已开源放在 ...
- 46. Permutations 回溯算法
https://leetcode.com/problems/permutations/ 求数列的所有排列组合.思路很清晰,将后面每一个元素依次同第一个元素交换,然后递归求接下来的(n-1)个元素的全排 ...
- ACM/ICPC 之 最长公共子序列计数及其回溯算法(51Nod-1006(最长公共子序列))
这道题被51Nod定为基础题(这要求有点高啊),我感觉应该可以算作一级或者二级题目,主要原因不是动态规划的状态转移方程的问题,而是需要理解最后的回溯算法. 题目大意:找到两个字符串中最长的子序列,子序 ...
- c语言数据结构:递归的替代-------回溯算法
1.要理解回溯就必须清楚递归的定义和过程. 递归算法的非递归形式可采用回溯算法.主要考虑的问题在于: 怎样算完整的一轮操作. 执行的操作过程中怎样保存当前的状态以确保以后回溯访问. 怎样返回至上一次未 ...
随机推荐
- Docker组件与元素(三)
说明: 这篇博文是根据国外的另一篇总结而来,第一个链接为原文,第二个为译文,第三个有几个图挺好 http://blog.flux7.com/blogs/docker ...
- 浅谈JavaScript函数重载
上个星期四下午,接到了网易的视频面试(前端实习生第二轮技术面试).面了一个多小时,自我感觉面试得很糟糕的,因为问到的很多问题都很难,根本回答不上来.不过那天晚上,还是很惊喜的接到了HR面电话.现在HR ...
- py-day2-4 python 集合
# 集合是由 { ,} 组成 test = {1,2,8,9,7,5} print(test) {1, 2, 5, 7, 8, 9} # 集合的结果是 去重的,且排序是 无序的 test = {1,2 ...
- Zookeeper 集群搭建--单机伪分布式集群
一. zk集群,主从节点,心跳机制(选举模式) 二.Zookeeper集群搭建注意点 1.配置数据文件 myid 1/2/3 对应 server.1/2/3 2.通过./zkCli.sh -serve ...
- 执行sql语句为什么?用PreparedStatement要比Statement好用
PreparedStatement public interface PreparedStatement extends Statement;可以看到PreparedStatement是Stateme ...
- Office_PPT_让你一分钟完成上百张图片的快速保存
1 方式 修改PPT文件格式,由PPT修改为rar,再进行解压操作 进入到ppt->media中找到你在PPT为文件中使用的图片. 2 PPT北京图片下载网址 别样网:https://www.s ...
- 开源ERP系统Odoo搭建文档
本文参考链接地址: https://devecho.com/v/209/ https://www.cnblogs.com/wxylog/p/6386974.html 什么是Odoo 为什么选择Odoo ...
- .NET自动化测试工具:Selenium Grid
在生产环境,QA会同时跑几十个上百个的test case.如果用单机串行的话,是一件非常耗时的事情,估计比手点快不了多少.使用并行方案的话,有两种方法,一个是自己写并行框架,一个是用现成的Seleni ...
- webservice的简单使用,cxf框架的的使用
Web service是一个平台独立的,低耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述.发布.发现.协调和配置这些应用程序,用于开发分布 ...
- Spring Boot探究之旅--启动分析
刚接触SpringBoot,感觉挺方便的,不用配置那么多乱七八糟的配置,很方便!酒饱思淫欲,得陇望蜀一下,看看SpringBoot到底怎么做到这么方便的. 首先呢,先来看个SpringBoot的hel ...