2019独角兽企业重金招聘Python工程师标准>>>

简单附上题目:输入两个整数 n 和 m,从数列1,2,3.......n 中随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来

如对于n=5, m = 5, 则由[1,4], [2, 3], [5]满足。

注意:题目隐含数字不可重复

直接上代码:

import java.util.ArrayList;
import java.util.Scanner;public class Main{public static void main(String[] args){Scanner sc = new Scanner(System.in);int n, m;ArrayList<Integer> list = new ArrayList<>();while(sc.hasNext()) {n = sc.nextInt();m = sc.nextInt();print(dfs(1, m, n, list));}}public static ArrayList<ArrayList<Integer>> dfs(int index, int count, int n, ArrayList<Integer> list) {ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();if(count == 0) {result.add(new ArrayList<>(list));}else {for(int i = index; i <= count && i <= n; i++) {list.add(i);result.addAll(dfs(i + 1, count - i, n, list));list.remove(list.size() - 1);}}return result;}public static void print(ArrayList<ArrayList<Integer>> result) {for(ArrayList<Integer> l : result) {int i = 0;for(; i < l.size() - 1; i++) {System.out.print(l.get(i) + " ");}System.out.println(l.get(i));}}
}

深度搜索的典型应用,这个题目的变种很多,但基本都是用的深搜,用于复习还是很不错的

程序中基本只有一个地方需要注意下,就是result.add(new ArrayList<>(list)),不能直接写result.add(list), 否则会由于引用的问题导致所有结果出错,result.add(new ArrayList<>(list))这种写法应该是最简单的list的复制方法了。

ps:

1. 其实代码还可以缩短,print函数可以省去,将打印结果的部分写在dfs函数中的if中。写成这样主要是为了调用方便,也比较直观。

2. 程序中提供的用于求和的数为1~n, 其实可以理解为有序的数组。但如果提供的数不是有序的,则需要对其进行修改。比如如果提供的数是{5,5,10,2,3},和为15,则原来的程序无法得出{5,5,2,3}这个结果。因为当list中包含两个5的时候,再遇到10时,不会进入for循环,此时result.addAll()运行结束,会直接执行list.remove(list.size()-1), 也就是会移除list中最后一个5,使list变为{5},再次执行循环时,dfs会从2位置开始执行,也就是列表的第三个数,这样,{5,5,2,3}的组合就永远不会出现。

所以,对于无序的数组,需要将

for(int i = index; i <= count && i <= n; i++) {list.add(i);result.addAll(dfs(i + 1, count - i, n, list));list.remove(list.size() - 1);
}

改为类似下面的形式。其中arr表示用于求和的数组,sum表示和。

for (int j = index; j < arr.length; j++) {if (arr[j] <= sum) {list.add(j);result.addAll(dfs(arr, j + 1, sum - arr[j], list));} else {if (j == arr.length - 1) {list.remove(list.size() - 1);}}
}

附上遇到的dfs的题:

http://acm.nyist.net/JudgeOnline/problem.php?pid=27

http://blog.csdn.net/qq_32183461/article/details/50705953

转载于:https://my.oschina.net/yitiaoxianyu/blog/1516611

深度优先搜索-和为某数的所有组合相关推荐

  1. 【洛谷】选数---深度优先搜索+单调不降去重

    题目描述 传送门:https://www.luogu.com.cn/problem/P1036 已知n个整数x1,x2-xn,以及一个整数k(k<n).从n个数字中任选k个数字相加,可分别得到一 ...

  2. 深度优先搜索——选数(洛谷 P1036)

    今天的题是一道深度优先搜索的题 题目链接 选自洛谷(P1036) 是一道很经典的DFS问题 首先我们先看一下题目是怎么描述的,读完题目我会在后面给出详细的思路! 题目描述 已知 nn 个整数 x_1, ...

  3. leetcode dfs_深度优先搜索:具有6个Leetcode示例的DFS图遍历指南

    leetcode dfs Have you ever solved a real-life maze? The approach that most of us take while solving ...

  4. c++输出方块_C/C++编程笔记:DFS 深度优先搜索的基本思想,含实例讲解

    采用搜索算法解决问题时,需要构造一个表明状态特征和不同状态之间关系的数据结构,这种数据结构称为结点.不同的问题需要用不同的数据结构描述. 根据搜索问题所给定的条件,从一个结点出发,可以生成一个或多个新 ...

  5. networkx 有向图强连通_leetcode刷题(四):搜索(深度优先搜索,广度优先搜索)拓扑排序,强连通分量...

    在开始今天的话题之前,我们先了解一个概念,什么是图的遍历? 图的遍历就是从图中某一点出发访遍图中其余剩余定点,且每个顶点仅被访问一次,这个过程叫做图的遍历. 图的遍历主要被分为深度优先遍历和广度优先遍 ...

  6. 图的深度搜索c语言,求图的深度优先搜索!该怎么处理

    当前位置:我的异常网» C语言 » 求图的深度优先搜索!该怎么处理 求图的深度优先搜索!该怎么处理 www.myexceptions.net  网友分享于:2013-03-16  浏览:12次 求图的 ...

  7. 深度优先搜索和广度优先搜索的比较与分析

    一)深度优先搜索的特点是: (1)无论问题的内容和性质以及求解要求如何不同,它们的程序结构都是相同的,即都是深度优先算法(一)和深度优先算法(二)中描述的算法结构,不相同的仅仅是存储结点数据结构和产生 ...

  8. hihocoder#1054 : 滑动解锁(深度优先搜索)

    描述 滑动解锁是智能手机一项常用的功能.你需要在3x3的点阵上,从任意一个点开始,反复移动到一个尚未经过的"相邻"的点.这些划过的点所组成的有向折线,如果与预设的折线在图案.方向上 ...

  9. 【数据结构与算法】2.深度优先搜索DFS、广度优先搜索BFS

    原文链接:https://blog.csdn.net/qq_41681241/article/details/81432634 总结 一般来说,广搜常用于找单一的最短路线,或者是规模小的路径搜索,它的 ...

最新文章

  1. oracle 判断如果有符合条件的记录则不插入_Oracle数据库AWR部分报告说明
  2. 解决Android Studio编译后安装apk报错:Error while Installing APK
  3. python函数调用外部变量_Python基础
  4. jstl 处理Date 时间
  5. Windows8.1还原文件类型的默认打开方式
  6. C++语言类和对象介绍和示例
  7. linux下ftp服务和dns的关系,linux企业常用服务---dns+ftp+dhcp
  8. Eclipse+svn+subclipse配置
  9. keras 升级_如何入门Keras?
  10. Codeforces Round #553 (Div. 2) 题解
  11. 1225 八数码难题
  12. Dubbo 优雅停机演进之路
  13. 搜索竞价推广方式OCPC VS CPC,谁更强
  14. Cutter - Cut Crop Video for Mac(视频剪辑格式转换工具)
  15. 论文阅读:Regularizing Deep Networks with Semantic Data Augmentation
  16. 字符串函数剖析(3)---strstr函数
  17. 虚拟主机和物理服务器有什么不同
  18. python能超越java吗_為什么Python能超越JAVA,有什么優勢?
  19. 库编译:opencv 交叉编译静态库
  20. noip 模拟赛 Po姐姐与他的妹子A

热门文章

  1. Zabbix系统端口监控状态
  2. 【Oracle】RedHat 6.5 安装 11g数据库
  3. VMware Workstation 常见问题解决
  4. 单线程无阻塞IO模型在Node.js中的工作方式
  5. 如何使用Bash将stdout和stderr重定向并附加到文件?
  6. 虚拟串口 服务器,ZNetCManager
  7. java如何构建图_如何从传递边构建子图?
  8. (转)MTK VC模拟器使用技巧
  9. 跳出多重循环_代码里的俄罗斯套娃 | 07 多重循环
  10. mysql5.7安装教程centos_CentOS7下MySQL5.7安装配置方法图文教程(YUM)