目前还存在的疑问:

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的更多相关文章

  1. Java求解迷宫问题:栈与回溯算法

    摘要: 使用栈的数据结构及相应的回溯算法实现迷宫创建及求解,带点JavaGUI 的基础知识. 难度: 中级 迷宫问题是栈的典型应用,栈通常也与回溯算法连用. 回溯算法的基本描述是: (1)  选择一个 ...

  2. 回溯算法——解决n皇后问题

    所谓回溯(backtracking)是通过系统地搜索求解问题的方法.这种方法适用于类似于八皇后这样的问题:求得问题的一个解比较困难,但是检查一个棋局是否构成解很容易. 不多说,放上n皇后的回溯问题代码 ...

  3. LeetCode37 使用回溯算法实现解数独,详解剪枝优化

    本文始发于个人公众号:TechFlow,原创不易,求个关注 数独是一个老少咸宜的益智游戏,一直有很多拥趸.但是有没有想过,数独游戏是怎么创造出来的呢?当然我们可以每一关都人工设置,但是显然这工作量非常 ...

  4. LeetCode46 回溯算法求全排列,这次是真全排列

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode的26篇文章,我们来实战一下全排列问题. 在之前的文章当中,我们讲过八皇后.回溯法,也提到了全排列,但是毕竟没有真正写 ...

  5. LeetCode通关:连刷十四题,回溯算法完全攻略

    刷题路线:https://github.com/youngyangyang04/leetcode-master 大家好,我是被算法题虐到泪流满面的老三,只能靠发发文章给自己打气! 这一节,我们来看看回 ...

  6. 3、回溯算法解题套路框架——Go语言版

    前情提示:Go语言学习者.本文参考https://labuladong.gitee.io/algo,代码自己参考抒写,若有不妥之处,感谢指正 关于golang算法文章,为了便于下载和整理,都已开源放在 ...

  7. 46. Permutations 回溯算法

    https://leetcode.com/problems/permutations/ 求数列的所有排列组合.思路很清晰,将后面每一个元素依次同第一个元素交换,然后递归求接下来的(n-1)个元素的全排 ...

  8. ACM/ICPC 之 最长公共子序列计数及其回溯算法(51Nod-1006(最长公共子序列))

    这道题被51Nod定为基础题(这要求有点高啊),我感觉应该可以算作一级或者二级题目,主要原因不是动态规划的状态转移方程的问题,而是需要理解最后的回溯算法. 题目大意:找到两个字符串中最长的子序列,子序 ...

  9. c语言数据结构:递归的替代-------回溯算法

    1.要理解回溯就必须清楚递归的定义和过程. 递归算法的非递归形式可采用回溯算法.主要考虑的问题在于: 怎样算完整的一轮操作. 执行的操作过程中怎样保存当前的状态以确保以后回溯访问. 怎样返回至上一次未 ...

随机推荐

  1. java_lambda表达式

    lambda表达式1    由来    概念        是通过策略模式来曲线实现的    lambda表达式2    语法详解    lambda表达式3    目标类型的概念    目标类型推断 ...

  2. java 各种循环遍历

    遍历方式选择: 实现了 RandomAccess 接口的 list,优先选择普通 for 循环 ,其次 foreach: 未实现 RandomAccess 接口的 list, 优先选择 iterato ...

  3. [ZZ] UIUC同学Jia-Bin Huang收集的计算机视觉代码合集

    UIUC同学Jia-Bin Huang收集的计算机视觉代码合集 http://blog.sina.com.cn/s/blog_4a1853330100zwgm.htmlv UIUC的Jia-Bin H ...

  4. PHP-ML机器学习库之安装篇

    1.PHP-ML库安装要求:PHP>=7.1 2.切换到项目的跟目录下,使用composer进行安装:composer require php-ai/php-ml 安装完成后的目录如下: 新建测 ...

  5. 关于缓冲的认识---Frame Buffer

    关于缓冲的认识---Frame Buffer 重点来了:

  6. 黄聪:通过 itms:services://? 在线安装ipa ,跨过appstore

    1.需要一个html文件,引导下载用户在线安装ipa <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN&quo ...

  7. [zz]如何学习Polygon Mesh Processing这本书?

    图形学初学者,如何学习Polygon Mesh Processing这本书?修改修改 导师暑假让我看看这本书,目前看了一半觉得这本书比较偏重数学基础,对于具体的 implementation提及的并不 ...

  8. react高阶组件

    高阶组件 为了提高组件复用性,在react中就有了HOC(Higher-Order Component)的概念.所谓的高阶组件,其本质依旧是组件,只是它返回另外一个组件,产生新的组件可以对属性进行包装 ...

  9. json 中关于json数组跟json对象的区别

    原文地址:http://blog.csdn.net/lafengwnagzi/article/details/52789171 JSON 是存储和交换文本信息的语法 JSON 文本格式在语法上与创建 ...

  10. idea本地跑代码和链接开发机设置