深度优先搜索-和为某数的所有组合
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
深度优先搜索-和为某数的所有组合相关推荐
- 【洛谷】选数---深度优先搜索+单调不降去重
题目描述 传送门:https://www.luogu.com.cn/problem/P1036 已知n个整数x1,x2-xn,以及一个整数k(k<n).从n个数字中任选k个数字相加,可分别得到一 ...
- 深度优先搜索——选数(洛谷 P1036)
今天的题是一道深度优先搜索的题 题目链接 选自洛谷(P1036) 是一道很经典的DFS问题 首先我们先看一下题目是怎么描述的,读完题目我会在后面给出详细的思路! 题目描述 已知 nn 个整数 x_1, ...
- leetcode dfs_深度优先搜索:具有6个Leetcode示例的DFS图遍历指南
leetcode dfs Have you ever solved a real-life maze? The approach that most of us take while solving ...
- c++输出方块_C/C++编程笔记:DFS 深度优先搜索的基本思想,含实例讲解
采用搜索算法解决问题时,需要构造一个表明状态特征和不同状态之间关系的数据结构,这种数据结构称为结点.不同的问题需要用不同的数据结构描述. 根据搜索问题所给定的条件,从一个结点出发,可以生成一个或多个新 ...
- networkx 有向图强连通_leetcode刷题(四):搜索(深度优先搜索,广度优先搜索)拓扑排序,强连通分量...
在开始今天的话题之前,我们先了解一个概念,什么是图的遍历? 图的遍历就是从图中某一点出发访遍图中其余剩余定点,且每个顶点仅被访问一次,这个过程叫做图的遍历. 图的遍历主要被分为深度优先遍历和广度优先遍 ...
- 图的深度搜索c语言,求图的深度优先搜索!该怎么处理
当前位置:我的异常网» C语言 » 求图的深度优先搜索!该怎么处理 求图的深度优先搜索!该怎么处理 www.myexceptions.net 网友分享于:2013-03-16 浏览:12次 求图的 ...
- 深度优先搜索和广度优先搜索的比较与分析
一)深度优先搜索的特点是: (1)无论问题的内容和性质以及求解要求如何不同,它们的程序结构都是相同的,即都是深度优先算法(一)和深度优先算法(二)中描述的算法结构,不相同的仅仅是存储结点数据结构和产生 ...
- hihocoder#1054 : 滑动解锁(深度优先搜索)
描述 滑动解锁是智能手机一项常用的功能.你需要在3x3的点阵上,从任意一个点开始,反复移动到一个尚未经过的"相邻"的点.这些划过的点所组成的有向折线,如果与预设的折线在图案.方向上 ...
- 【数据结构与算法】2.深度优先搜索DFS、广度优先搜索BFS
原文链接:https://blog.csdn.net/qq_41681241/article/details/81432634 总结 一般来说,广搜常用于找单一的最短路线,或者是规模小的路径搜索,它的 ...
最新文章
- oracle 判断如果有符合条件的记录则不插入_Oracle数据库AWR部分报告说明
- 解决Android Studio编译后安装apk报错:Error while Installing APK
- python函数调用外部变量_Python基础
- jstl 处理Date 时间
- Windows8.1还原文件类型的默认打开方式
- C++语言类和对象介绍和示例
- linux下ftp服务和dns的关系,linux企业常用服务---dns+ftp+dhcp
- Eclipse+svn+subclipse配置
- keras 升级_如何入门Keras?
- Codeforces Round #553 (Div. 2) 题解
- 1225 八数码难题
- Dubbo 优雅停机演进之路
- 搜索竞价推广方式OCPC VS CPC,谁更强
- Cutter - Cut Crop Video for Mac(视频剪辑格式转换工具)
- 论文阅读:Regularizing Deep Networks with Semantic Data Augmentation
- 字符串函数剖析(3)---strstr函数
- 虚拟主机和物理服务器有什么不同
- python能超越java吗_為什么Python能超越JAVA,有什么優勢?
- 库编译:opencv 交叉编译静态库
- noip 模拟赛 Po姐姐与他的妹子A
热门文章
- Zabbix系统端口监控状态
- 【Oracle】RedHat 6.5 安装 11g数据库
- VMware Workstation 常见问题解决
- 单线程无阻塞IO模型在Node.js中的工作方式
- 如何使用Bash将stdout和stderr重定向并附加到文件?
- 虚拟串口 服务器,ZNetCManager
- java如何构建图_如何从传递边构建子图?
- (转)MTK VC模拟器使用技巧
- 跳出多重循环_代码里的俄罗斯套娃 | 07 多重循环
- mysql5.7安装教程centos_CentOS7下MySQL5.7安装配置方法图文教程(YUM)