回溯算法_ 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.要理解回溯就必须清楚递归的定义和过程. 递归算法的非递归形式可采用回溯算法.主要考虑的问题在于: 怎样算完整的一轮操作. 执行的操作过程中怎样保存当前的状态以确保以后回溯访问. 怎样返回至上一次未 ...
随机推荐
- java-Redis集合
引用包:jedis-3.0.1.jar.commons-pool2-2.6.0.jar 一.从Redis集合中实时获取数据: 连接Redis import redis.clients.jedis.Je ...
- sqlserver乱码问题解决
* 如果是自己创建的数据库那么就应该在一开始就选择排序规则中的:Chinese_PRC_CI_AS 1.改变排序规则方法: 右击创建的数据库,属性→选项→排序规则中选择:Chinese_PRC_CI_ ...
- 3、PHP中常用的数据库操作函数解析
mysql_connect 连接数据库 mysql_select_db 选择需要操作的数据库 mysql_query 执行数据库操作语句 mysql_fetch_array 以数组的形式返回每行查询 ...
- selenium基础用法(爬虫)
初识selenium selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题 selenium本质是通过驱动浏览器,完全模拟浏 ...
- 12月中旬项目中出现的几个bug解决方法的思考
这周做的项目遇到2个费了很多时间才解决的bug,解决之后,发现根本问题并不是什么很难的技术难点,都是因为自己在写代码的过程中,思维不够清晰.还有一个需要再提高的地方就是解决问题的思维,如何快速定位到问 ...
- 静态初始化块和main方法哪个先被执行?
直接看代码 public class BlockAndMain { public static void main(String[] args) { System.out.println(" ...
- nginx配置分发Tomcat服务,负载均衡
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 项目中瓦片资源越来越多,如果提高瓦片的访问效率是一个需要解决的 ...
- kubernetes学习笔记之十二:资源指标API及自定义指标API
第一章.前言 以前是用heapster来收集资源指标才能看,现在heapster要废弃了从1.8以后引入了资源api指标监视 资源指标:metrics-server(核心指标) 自定义指标:prome ...
- Android 开发 知晓各种id信息 获取线程ID、activityID、内核ID
/** * Returns the identifier of this process's user. * 返回此进程的用户的标识符. */ Log.e(TAG, "Process.myU ...
- fastjson的@JSONField注解
@JSONField作用:在字段和方法上1.Field:@JSONField作用在Field时,name可以定义输入key的名字,反序列化的时 值不会赋值到属性上2.作用在setter和getter方 ...