代码:

个人浅薄的认为DFS就是回溯法中的一种,一般想到用DFS我们脑中一般都有一颗解法树,然后去按照深度优先搜索去寻找解。而分支界限法则不算是回溯,无论其是采用队列形式的还是优先队列形式的分支界限法。

下面这个函数就是我的DFS的函数,先介绍一下参数的含义,index表示当前要判断是否合适的candidates中的元素的下标,t表示即将要把新数据加入的位置。

 1 void backTrace(int sum, int target, int a[], int index, int t, vector<int>& candidates)
 2 {
 3     if (sum == target)
 4     {
 5         vector<int> b;
 6         for (int i = 0; i < t; i++)
 7         {
 8             b.push_back(a[i]);
 9         }
10         sort(b.begin(),b.end());
11         result.push_back(b);
12     }
13     if (sum>target)
14     {
15         return;
16     }
17     for (int i = index; i < candidates.size(); i++)
18     {
19         a[t] = candidates[i];
20         backTrace(sum + candidates[i], target, a, i, t + 1, candidates);
21     }
22 }

这是很典型的深搜的题目了,我写回溯法特别容易出错,一个好的解决方法就是画出简易的、局部的解法树,然后根据解法树判断什么时候回溯,回溯的下一步是什么,回溯的逻辑关系是循环控制还是有其他方式控制(二叉树就是简单的左右控制),还有就是当前参数就是当前的数据源不能混。

哈哈哈哈!!!

这个题我也有改进技巧啦:

 1 #include<iostream>
 2 #include<vector>
 3 #include<algorithm>
 4
 5 using namespace std;
 6
 7
 8 vector<vector<int>> result;
 9 int a[100];
10
11 void backTrace(int sum, int target, int a[], int index, int t, vector<int>& candidates)
12 {
13     if (sum == target)
14     {
15         vector<int> b;
16         for (int i = 0; i < t; i++)
17         {
18             b.push_back(a[i]);
19         }
20         result.push_back(b);
21     }
22     if (sum>target)
23     {
24         return;
25     }
26     for (int i = index; i < candidates.size(); i++)
27     {
28         a[t] = candidates[i];
29         backTrace(sum + candidates[i], target, a, i, t + 1, candidates);
30         if (candidates[i] + sum > target)
31             return;
32     }
33 }
34
35 vector<vector<int>> combinationSum(vector<int>& candidates, int target)
36 {
37     sort(candidates.begin(), candidates.end());
38     backTrace(0, target, a, 0, 0, candidates);
39     return result;
40 }
41
42 int main()
43 {
44     vector<int> can = { 2, 3, 6, 7 };
45     combinationSum(can, 7);
46     for (int i = 0; i < result.size(); i++)
47     {
48         for (int j = 0; j < result[i].size(); j++)
49         {
50             cout << result[i][j] << "    ";
51         }
52         cout << endl;
53     }
54 }

改进点就是先对candidates进行从小到大的排序,然后就可以加上30~31的这行代码了,这个能减少不少无用的尝试,然后就是结果集,由于我们已经排好序了,且加入是从小到大所以,后来的就不需要排序了,直接添加就好了。少了第10行。

哈哈哈哈哈哈。。。。

我的一个小伙伴提供了一个思路,根据这个思路可以不用recursion,下面介绍一下,明天叫上代码:

先用target去减集合中的第一个元素然后在集合中寻找减的结果,如果有则作为一个成功的探索,如果没有继续减该元素然后继续寻找,直到减的结果小于零。再去尝试集合中的下一个元素。

转载于:https://www.cnblogs.com/chaiwentao/p/4500631.html

回溯法和DFS leetcode Combination Sum相关推荐

  1. LeetCode Combination Sum IV(动态规划)

    问题:给出一个数组nums和目标数target,问有多少组合形式 思路:用dp(i)表示目标数target的组合数.则有状态转移关系为dp(i)=sum(dp(i-nums[j])),其中i>= ...

  2. LeetCode Combination Sum

    因为实验室项目好久没刷题了.从今天开始重新开始刷题. Given a set of candidate numbers (C) and a target number (T), find all un ...

  3. 【DFS】LeetCode 39. Combination Sum

    LeetCode 39. Combination Sum Solution1: DFS,这个套路要熟记啊! class Solution { public:vector<vector<in ...

  4. 【动态规划】LeetCode 377. Combination Sum IV

    LeetCode 377. Combination Sum IV Solution1: 我的未能AC的答案 题目描述的和前几道题差不多,但实际上不能用DFS来做(会超时),要用动态规划,还是记录一下吧 ...

  5. 【LeetCode】#39组合总和(Combination Sum)

    [LeetCode]#39组合总和(Combination Sum) 加粗样式 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数 ...

  6. 40. Combination Sum II 组合总和 II

    给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的每个数字在每个组合中只能使用一次. ...

  7. 216. Combination Sum III

    /** 216. Combination Sum III * 2016-6-12 by Mingyang* i一定要取到9,虽然大小聪明,想只取到7,但是后面的遍历可能也会遍历到9啊.* 1.长度标准 ...

  8. 36 数字组合(Combination Sum)

    文章目录 1 题目 2 解决方案 2.1 思路 2.2 图解 2.3 时间复杂度 2.4 空间复杂度 3 源码 1 题目 题目:数字组合(Combination Sum) 描述:给定一个候选数字的集合 ...

  9. LC39 Combination Sum

    还是利用深搜的思想,注意一个元素可以取无数次.而LC40 Combination Sum II 就有次数限制,有次数限制的情况下可以先判断一个数是否与它前面的数相等,若相等则跳过该元素,直到找到一个数 ...

最新文章

  1. Eclipse中propedit插件安装(解决property中文问题)
  2. 1970.1.1这个特殊时间
  3. 阿里云服务器Svn-Server无法连接,阿里云服务器SVNServer配置
  4. TensorFlow机器学习实战指南之第一章
  5. JIAVA知识点整理
  6. TCP/IP之(四)Delay ack 和 Nagle算法
  7. Backbone.js源码解读(转载)
  8. 采用Docker集成jquery-file-upload组件到WEB应用
  9. 【测试】软件测试计划的编写
  10. mysql允许虚拟机访问权限_设置虚拟机安装的mysql访问权限及删除mysql
  11. java语言程序设计第三版电子书百度云_Java语言程序设计(基础篇)(原书第10版) 完整版 中文pdf扫描版[259MB]梁勇...
  12. 用计算机录制声音让音质更好,电脑有什么好用的录音软件吗
  13. 笨办法学python习题39-40
  14. oracle快照点,Oracle快照(snapshot)管理
  15. 如何为word增加页码,且第一页不显示页码?
  16. 内网穿透远程访问家里的群晖NAS 1-2
  17. 牛刀:中国房价的买点还没有…
  18. STM32音频频谱分析设计方案(程序+原理图+PCB)
  19. vb与oracle数据库连接,vb.net 如何与oracle数据库连接
  20. Speckle+IFC.js:开源BIM

热门文章

  1. 把「光」存储1小时,中科大新研究破世界纪录,保真度高达96.4% | Nature子刊
  2. Arm v9的牙膏挤出来了,超大核机器学习性能x2,小核4年来终于更新
  3. 超强平衡机器人,走钢丝、玩忍者步伐,还可以做瑜伽动作,不受干扰的那种 | IEEE 2020...
  4. 想在PyTorch里训练BERT,请试试Facebook跨语言模型XLM
  5. 基本算法系列15天速成
  6. iebook 发布到网站 独家秘诀
  7. 3、循序渐进设计模式-创建型
  8. Oracle 重做日志简介
  9. Controller的要求
  10. 【vs开发】向图形界面程序添加控制台