
深度优先搜索之代表团出访
发布日期:2021-05-07 22:03:34
浏览次数:16
分类:精选文章
本文共 1097 字,大约阅读时间需要 3 分钟。
1. 问题描述:
题目:
X星球要派出一个5人组成的观察团前往W星。 其中: A国最多可以派出4人。 B国最多可以派出2人。 C国最多可以派出2人。 D国最多可以派出1人。 E国最多可以派出1人。 F国最多可以派出3人。那么最终派往W星的观察团会有多少种国别的不同组合呢?
2. 思路分析:
① 仔细分析一下题目我们可以知道实际上这个是与之前的m个具有重复球中取出n个球的问题,所以我们可以直接套用之前写过的具有重复性元素的组合问题的求解的代码
② 中间我们可以记录一下其中组合的过程,这样就可以验证答案是否是正确的了
③ 其中还加了一个小小的优化就是之前的for循环的结束条件是i <= goal,但是后来发现i + cur <= goal 就好了因为当取到的数量大于了了目标之后那么接下来进行的试探就没有意义了,所以可以在for循环的限制条件上加上这个,也是相当于提前进行了剪枝。最终的答案为101
3. 代码如下:
import java.util.ArrayList;import java.util.List;public class Main { static int count = 0; static Listres = new ArrayList (); public static void main(String[] args) { int arr[] = {4, 2, 2, 1, 1, 3}; dfs(arr, 0, 0, 5, ""); System.out.println(count); } private static void dfs(int[] arr, int k, int cur, int goal, String s) { if(cur == goal){ count++; System.out.println(s); return; } if(k == arr.length){ return; } //优化的一个点是加上了for循环的第二个限制条件我们可以减少不必要的搜索 for(int i = 0; i <= arr[k] && (i + cur) <= goal; i++){ String t = s; for(int j = 0; j < i; j++){ s += (char) (k + 'A'); } dfs(arr, k + 1, cur + i, goal, s); //回溯 s = t; } }}
发表评论
最新留言
网站不错 人气很旺了 加油
[***.192.178.218]2025年04月14日 15时39分08秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
操作系统:缓冲技术的相关介绍
2019-03-05
函数与指针分析、回调函数
2019-03-05
新型类型转换
2019-03-05
类的实例
2019-03-05
Java中数据类型和运算符
2019-03-05
PAT 锤子剪刀布
2019-03-05
tomcat加载部署webapps目录下的项目
2019-03-05
ACM/NCPC2016 C Card Hand Sorting(upc 3028)
2019-03-05
方法重写
2019-03-05
Threading Programming Guide(多线程编程指南)
2019-03-05
Socket通信原理和基础实践
2019-03-05
Java求逆波兰表达式的结果(栈)
2019-03-05
SDWebImage--http图片加载不出来的问题
2019-03-05
Application received signal SIGSEGV
2019-03-05
MySQL删除数据库时的错误(errno: 39)
2019-03-05
关于MySQL连接时出现的错误之一
2019-03-05
eclipse下Struts2配置文件添加自动提示
2019-03-05
Win10 JDK配置环境变量以及为什么需要配置每部分的原因
2019-03-05
ubuntu学习笔记-常用文件、命令以及作用(hosts、vim、ssh)
2019-03-05
SLAM学习笔记-求解视觉SLAM问题
2019-03-05