【算法笔记】深度优先遍历-解决排列组合问题-
深度优先遍历-解决排列组合问题
问题1:
假设袋子里有编号为1,2,…,m这m个球。现在每次从袋子中取一个球记下编号,放回袋中再取,取n次作为一组,枚举所有可能的情况。
分析:
每一次取都有m种可能的情况,因此一共有 m n m^n mn种情况。
这里我们取m = 3, n = 4,则有 3 4 3^4 34种不同的情况。
代码:
import java.util.Stack;public class Test {static int cnt = 0;static Stack<Integer> s = new Stack<Integer>();/*** 递归方法,当实际选取的小球数目与要求选取的小球数目相同时,跳出递归* @param minv - 小球编号的最小值* @param maxv - 小球编号的最大值* @param curnum - 当前已经确定的小球的个数* @param maxnum - 要选取的小球的数目*/public static void kase1(int minv,int maxv,int curnum, int maxnum){if(curnum == maxnum){cnt++;System.out.println(s);return;}for(int i = minv; i <= maxv; i++){s.push(i);kase1(minv, maxv, curnum+1, maxnum);s.pop();}}public static void main(String[] args){kase1(1, 3, 0, 4);System.out.println(cnt);}
}
输出:
[1, 1, 1, 1]
[1, 1, 1, 2]
[1, 1, 1, 3]
[1, 1, 2, 1]
[1, 1, 2, 2]
[1, 1, 2, 3]
[1, 1, 3, 1]
[1, 1, 3, 2]
[1, 1, 3, 3]
[1, 2, 1, 1]
[1, 2, 1, 2]
[1, 2, 1, 3]
[1, 2, 2, 1]
[1, 2, 2, 2]
[1, 2, 2, 3]
[1, 2, 3, 1]
[1, 2, 3, 2]
[1, 2, 3, 3]
[1, 3, 1, 1]
[1, 3, 1, 2]
[1, 3, 1, 3]
[1, 3, 2, 1]
[1, 3, 2, 2]
[1, 3, 2, 3]
[1, 3, 3, 1]
[1, 3, 3, 2]
[1, 3, 3, 3]
[2, 1, 1, 1]
[2, 1, 1, 2]
[2, 1, 1, 3]
[2, 1, 2, 1]
[2, 1, 2, 2]
[2, 1, 2, 3]
[2, 1, 3, 1]
[2, 1, 3, 2]
[2, 1, 3, 3]
[2, 2, 1, 1]
[2, 2, 1, 2]
[2, 2, 1, 3]
[2, 2, 2, 1]
[2, 2, 2, 2]
[2, 2, 2, 3]
[2, 2, 3, 1]
[2, 2, 3, 2]
[2, 2, 3, 3]
[2, 3, 1, 1]
[2, 3, 1, 2]
[2, 3, 1, 3]
[2, 3, 2, 1]
[2, 3, 2, 2]
[2, 3, 2, 3]
[2, 3, 3, 1]
[2, 3, 3, 2]
[2, 3, 3, 3]
[3, 1, 1, 1]
[3, 1, 1, 2]
[3, 1, 1, 3]
[3, 1, 2, 1]
[3, 1, 2, 2]
[3, 1, 2, 3]
[3, 1, 3, 1]
[3, 1, 3, 2]
[3, 1, 3, 3]
[3, 2, 1, 1]
[3, 2, 1, 2]
[3, 2, 1, 3]
[3, 2, 2, 1]
[3, 2, 2, 2]
[3, 2, 2, 3]
[3, 2, 3, 1]
[3, 2, 3, 2]
[3, 2, 3, 3]
[3, 3, 1, 1]
[3, 3, 1, 2]
[3, 3, 1, 3]
[3, 3, 2, 1]
[3, 3, 2, 2]
[3, 3, 2, 3]
[3, 3, 3, 1]
[3, 3, 3, 2]
[3, 3, 3, 3]
81
问题2:
假设袋子里有编号为1,2,…,m这m个球。先后从袋子中取出n个球,依次记录编号,枚举所有可能的情况。
分析:
这是排列问题,如果取出的球顺序不同,也是算不同的情况。因此应该有 m ∗ ( m − 1 ) ∗ ( m − 2 ) ∗ . . . ∗ ( m − n + 1 ) m*(m-1)*(m-2)*...*(m-n+1) m∗(m−1)∗(m−2)∗...∗(m−n+1)种情况,即 A m n = m ! ( m − n ) ! A_m^n=\frac{m!}{(m-n)!} Amn=(m−n)!m!种
这里取m = 5, n = 3。则有5*4*3种。
和问题1相比,唯一的区别是排列中不可以有重复。因此开了used数组用以标记是否已经访问。
代码:
import java.util.Stack;public class Test {static int cnt = 0;static Stack<Integer> s = new Stack<Integer>();static boolean[] used = new boolean[10000];/*** 递归方法,当实际选取的小球数目与要求选取的小球数目相同时,跳出递归* @param minv - 小球编号的最小值* @param maxv - 小球编号的最大值* @param curnum - 当前已经确定的小球的个数* @param maxnum - 要选取的小球的数目*/public static void kase2(int minv,int maxv,int curnum, int maxnum){if(curnum == maxnum){cnt++;System.out.println(s);return;}for(int i = minv; i <= maxv; i++){if(!used[i]){ //判断是否已经取过s.push(i);used[i] = true;kase2(minv, maxv, curnum+1, maxnum);s.pop();used[i] = false;}}}public static void main(String[] args){kase2(1, 5, 0, 3);System.out.println(cnt);}
}
输出:
[1, 2, 3]
[1, 2, 4]
[1, 2, 5]
[1, 3, 2]
[1, 3, 4]
[1, 3, 5]
[1, 4, 2]
[1, 4, 3]
[1, 4, 5]
[1, 5, 2]
[1, 5, 3]
[1, 5, 4]
[2, 1, 3]
[2, 1, 4]
[2, 1, 5]
[2, 3, 1]
[2, 3, 4]
[2, 3, 5]
[2, 4, 1]
[2, 4, 3]
[2, 4, 5]
[2, 5, 1]
[2, 5, 3]
[2, 5, 4]
[3, 1, 2]
[3, 1, 4]
[3, 1, 5]
[3, 2, 1]
[3, 2, 4]
[3, 2, 5]
[3, 4, 1]
[3, 4, 2]
[3, 4, 5]
[3, 5, 1]
[3, 5, 2]
[3, 5, 4]
[4, 1, 2]
[4, 1, 3]
[4, 1, 5]
[4, 2, 1]
[4, 2, 3]
[4, 2, 5]
[4, 3, 1]
[4, 3, 2]
[4, 3, 5]
[4, 5, 1]
[4, 5, 2]
[4, 5, 3]
[5, 1, 2]
[5, 1, 3]
[5, 1, 4]
[5, 2, 1]
[5, 2, 3]
[5, 2, 4]
[5, 3, 1]
[5, 3, 2]
[5, 3, 4]
[5, 4, 1]
[5, 4, 2]
[5, 4, 3]
60
问题3:
从m个球里(编号为1,2,3…,m)一次取n个球,其中m>n,记录取出球的编号,枚举所有的可能性。
分析:
这是组合问题。应该有 ( m n ) = m ! n ! ( m − n ) ! \binom{m}{n}=\frac{m!}{n!(m-n)!} (nm)=n!(m−n)!m!种可能性。
这里,如果取m = 8, n = 4. 则有 ( 8 4 ) = 8 ! 4 ! ( 8 − 4 ) ! = 8 × 7 × 6 × 5 4 × 3 × 2 × 1 = 70 \binom{8}{4}=\frac{8!}{4!(8-4)!}=\frac{8\times7\times6\times5}{4\times3\times2\times1}=70 (48)=4!(8−4)!8!=4×3×2×18×7×6×5=70种可能。
代码:
import java.util.Stack;public class Test {static int cnt = 0;static Stack<Integer> s = new Stack<Integer>();/*** 递归方法,当前已抽取的小球个数与要求抽取小球个数相同时,退出递归* @param curnum - 当前已经抓取的小球数目* @param curmaxv - 当前已经抓取小球中最大的编号* @param maxnum - 需要抓取小球的数目* @param maxv - 待抓取小球中最大的编号*/public static void kase3(int curnum, int curmaxv, int maxnum, int maxv){if(curnum == maxnum){cnt++;System.out.println(s);return;}for(int i = curmaxv + 1; i <= maxv; i++){ // i <= maxv - maxnum + curnum + 1s.push(i);kase3(curnum + 1, i, maxnum, maxv);s.pop();}}public static void main(String[] args){kase3(0, 0, 4, 8);System.out.println(cnt);}
}
输出:
[1, 2, 3, 4]
[1, 2, 3, 5]
[1, 2, 3, 6]
[1, 2, 3, 7]
[1, 2, 3, 8]
[1, 2, 4, 5]
[1, 2, 4, 6]
[1, 2, 4, 7]
[1, 2, 4, 8]
[1, 2, 5, 6]
[1, 2, 5, 7]
[1, 2, 5, 8]
[1, 2, 6, 7]
[1, 2, 6, 8]
[1, 2, 7, 8]
[1, 3, 4, 5]
[1, 3, 4, 6]
[1, 3, 4, 7]
[1, 3, 4, 8]
[1, 3, 5, 6]
[1, 3, 5, 7]
[1, 3, 5, 8]
[1, 3, 6, 7]
[1, 3, 6, 8]
[1, 3, 7, 8]
[1, 4, 5, 6]
[1, 4, 5, 7]
[1, 4, 5, 8]
[1, 4, 6, 7]
[1, 4, 6, 8]
[1, 4, 7, 8]
[1, 5, 6, 7]
[1, 5, 6, 8]
[1, 5, 7, 8]
[1, 6, 7, 8]
[2, 3, 4, 5]
[2, 3, 4, 6]
[2, 3, 4, 7]
[2, 3, 4, 8]
[2, 3, 5, 6]
[2, 3, 5, 7]
[2, 3, 5, 8]
[2, 3, 6, 7]
[2, 3, 6, 8]
[2, 3, 7, 8]
[2, 4, 5, 6]
[2, 4, 5, 7]
[2, 4, 5, 8]
[2, 4, 6, 7]
[2, 4, 6, 8]
[2, 4, 7, 8]
[2, 5, 6, 7]
[2, 5, 6, 8]
[2, 5, 7, 8]
[2, 6, 7, 8]
[3, 4, 5, 6]
[3, 4, 5, 7]
[3, 4, 5, 8]
[3, 4, 6, 7]
[3, 4, 6, 8]
[3, 4, 7, 8]
[3, 5, 6, 7]
[3, 5, 6, 8]
[3, 5, 7, 8]
[3, 6, 7, 8]
[4, 5, 6, 7]
[4, 5, 6, 8]
[4, 5, 7, 8]
[4, 6, 7, 8]
[5, 6, 7, 8]
70
相关文章:
【算法笔记】深度优先遍历-解决排列组合问题-
深度优先遍历-解决排列组合问题 问题1: 假设袋子里有编号为1,2,…,m这m个球。现在每次从袋子中取一个球记下编号,放回袋中再取,取n次作为一组,枚举所有可能的情况。 分析: 每一次取都有m种可能的情况,因此…...
【雕爷学编程】Arduino动手做(184)---快餐盒盖,极低成本搭建机器人实验平台2
吃完快餐粥,除了粥的味道不错之外,我对个快餐盒的圆盖子产生了兴趣,能否做个极低成本的简易机器人呢?也许只需要二十元左右 知识点:轮子(wheel) 中国词语。是用不同材料制成的圆形滚动物体。简…...
应急响应-勒索病毒的处理思路
0x00 关于勒索病毒的描述 勒索病毒入侵方式:服务弱口令,未授权,邮件钓鱼,程序木马植入,系统漏洞等 勒索病毒的危害:主机文件被加密,且几乎难以解密,对主机上的文件信息以及重要资产…...
ChatGPT是否能够处理多模态数据和多模态对话?
ChatGPT有潜力处理多模态数据和多模态对话,这将进一步扩展其在各种应用领域中的实用性。多模态数据是指包含多种不同类型的信息,例如文本、图像、音频和视频等。多模态对话是指涉及多种媒体形式的对话交流,例如同时包含文本和图像的对话。 *…...
AcWing1171. 距离(lcatarjan)
输入样例1: 2 2 1 2 100 1 2 2 1输出样例1: 100 100输入样例2: 3 2 1 2 10 3 1 15 1 2 3 2输出样例2: 10 25 #include<bits/stdc.h> using namespace std; typedef long long ll; const int N2e55; int n,m,x,y,k,r…...
JVM-运行时数据区
目录 什么是运行时数据区? 方法区 堆 程序计数器 虚拟机栈 局部变量表 操作数栈 动态连接 运行时常量池 方法返回地址 附加信息 本地方法栈 总结: 什么是运行时数据区? Java虚拟机在执行Java程序时,将它管…...
RedisTemplate中boundHashOps的使用
1、往指定key中存储 键值 redisTemplate.boundHashOps("demo").put("1",1); 2、根据指定key中得键取出值 System.out.println(redisTemplate.boundHashOps("demo").get("1")); 3、根据指定key中得键删除 redisTemplate.boundHash…...
计算机网络-性能指标
计算机网络-性能指标 文章目录 计算机网络-性能指标简介速率比特速率 带宽吞吐量时延时延计算 时延带宽积往返时间网络利用率丢包率总结 简介 性能指标可以从不同的方面来度量计算机网络的性能 常用的计算机网络的性能指标有以下8个 速率带宽吞吐量时延时延带宽积往返时间利…...
排序第一课【插入排序】直接插入排序 与 希尔排序
目录 1. 排序的概念: 2.插入排序基本思想 3.直接插入排序 4.希尔排序 1. 排序的概念: 排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 稳定性…...
云计算——ACA学习 云计算概述
作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页 目录 写在前面 上章回顾 本章简介 本章目标 一.云计算产生背景 1.信息时代的重点变革…...
如何为网站进行全面的整站翻译?
要翻译整个网站,可以按照以下步骤进行: 确定翻译需求:确定你需要将整个网站翻译成哪种语言。这可以根据你的目标受众和市场进行决定。 寻找翻译资源:你可以选择以下几种方式来进行网站翻译: a. 人工翻译:雇…...
项目部署(前后端分离)
1、前端项目 (打包成dist文件,放到nginx的html目录下面),然后配置nginx 2、后端项目部署 使用之前的shell脚本(然后赋予用户权限),最后运行脚本 查看进程...
增强型Web安全网关在银行的应用
销售,绝不是降低身份去取悦客户,而是像朋友一样给予合理的建议。你刚好需要,我刚好专业!仅此而已! 乔.吉拉德 健康的安全体系,还可以更完善 浙江某商业银行股份有限公司是一家成立多年的商业银行…...
Oracle-ORA-00600:[ktspffbmb:objdchk_kcbnew_3]
问题背景: 应用执行存储过程报错ORA-00600: 内部错误代码, 参数: [ktspffbmb:objdchk_kcbnew_3], [0], [3303775], [4], [], [], [], [], [], [], [], [],导致过程无法正常执行 ORA-00600: 内部错误代码, 参数: [ktspffbmb:objdchk_kcbnew_3], [0], [3303775], [4]…...
SPINN:基于设备和云的神经网络协同递进推理
SPINN:基于设备和云的神经网络协同递进推理 论文标题:SPINN: synergistic progressive inference of neural networks over device and cloud 原文链接:https://dl.acm.org/doi/10.1145/3372224.3419194 论文动机 现代CNN过多的计算需求&am…...
数据结构-二叉树
数据结构-二叉树 二叉树的概念二叉树的遍历分类 建立二叉树,并遍历二叉树的最小单元二叉树的最小单元初始化初始化二叉树前序遍历的实现中序遍历的实现后序遍历的实现计算节点的个数计算树的深度求第k层的个数查找二叉树的元素分层遍历 全部代码如下 二叉树的概念 二…...
Open3D 进阶(4)高斯混合点云聚类
目录 一、算法原理1、原理概述2、实现流程3、参考文献二、代码实现三、结果展示四、测试数据本文由CSDN点云侠原创,原文链接。爬虫网站自重。 一、算法原理 1、原理概述 高斯混合聚类(GMM)算法假设数据点是由一个或多个高斯分布生成的,并通过最大似然估计的方法来估计每个簇…...
计算机组成和IO
文章目录 计组和Epoll:计算机组成原理:网络数据接收的流程:内核如何管理socket以及状态的更新select系统调用的复杂度epoll的et和lt模式及java的选择 国内访问chatai就可以 https://aiweb.douguguo.com/?typeadd计组和Epoll: 计…...
STM32CUBUMX配置RS485 modbus STM32(从机)亲测可用
———————————————————————————————————— ⏩ 大家好哇!我是小光,嵌入式爱好者,一个想要成为系统架构师的大三学生。 ⏩最近在开发一个STM32H723ZGT6的板子,使用STM32CUBEMX做了很多驱动&#x…...
系统设计类题目汇总
1 设计一个系统统计当前时刻北京用户在线人数 【Redis】位图以及位图的使用场景(统计在线人数和用户在线状态) 1.1 方案一: 在用户登录时,使用 Redis SET 将用户 ID 添加到一个特定的键(例如 “online:beijing”)。用户退出时&…...
开源工具MelonLoader:Unity游戏模组开发的3大突破与零基础上手指南
开源工具MelonLoader:Unity游戏模组开发的3大突破与零基础上手指南 【免费下载链接】MelonLoader The Worlds First Universal Mod Loader for Unity Games compatible with both Il2Cpp and Mono 项目地址: https://gitcode.com/gh_mirrors/me/MelonLoader …...
LSPosed-Irena框架深度解析:构建下一代Android Hook框架的完整指南
LSPosed-Irena框架深度解析:构建下一代Android Hook框架的完整指南 【免费下载链接】LSPosed-Irena Useless LSPosed Framework Fork 项目地址: https://gitcode.com/gh_mirrors/ls/LSPosed-Irena LSPosed-Irena是一个基于LSPlant的ART hooking框架ÿ…...
MOOTDX终极指南:Python通达信数据接口让量化分析变得简单高效
MOOTDX终极指南:Python通达信数据接口让量化分析变得简单高效 【免费下载链接】mootdx 通达信数据读取的一个简便使用封装 项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx 你是否曾为获取股票数据而烦恼?面对复杂的API接口和繁琐的数据…...
51单片机之按键控制RGB灯
51单片机之按键控制RGB灯描述:利用KEIL5编程,使AT89C52通过按键输入控制RGB灯显示不同颜色。硬件:电路仿真图(未运行)电路仿真图(运行)程序:主要是按键消抖,机械按键按下…...
如何用Real-ESRGAN-ncnn-vulkan解决5种常见的图像质量问题?
如何用Real-ESRGAN-ncnn-vulkan解决5种常见的图像质量问题? 【免费下载链接】Real-ESRGAN-ncnn-vulkan NCNN implementation of Real-ESRGAN. Real-ESRGAN aims at developing Practical Algorithms for General Image Restoration. 项目地址: https://gitcode.co…...
APKMirror客户端:安卓应用安全下载与管理的革新方案
APKMirror客户端:安卓应用安全下载与管理的革新方案 【免费下载链接】APKMirror 项目地址: https://gitcode.com/gh_mirrors/ap/APKMirror 在安卓应用获取的过程中,用户常常面临两难选择:官方应用商店的更新滞后与第三方平台的安全隐…...
多无人机协同打击任务分配方法
随着无人机技术的不断成熟和完善,其军事应用的优势日益显现,近年来其在军事冲突中 所发挥的作用更使人们认识到,无人机在未来战争中将成为重要的军事装备。随着无人机在军 事中的大量应用,无人机集群协同执行任务将成为典型的应用…...
Jailer命令行大师课:自动化数据库子集化的10个技巧
Jailer命令行大师课:自动化数据库子集化的10个技巧 【免费下载链接】Jailer Database Subsetting and Relational Data Browsing Tool. 项目地址: https://gitcode.com/gh_mirrors/ja/Jailer Jailer是一款强大的开源数据库子集化工具,专注于从生产…...
HUNYUAN-MT赋能Agent智能体:构建具备多语言交互能力的AI助手
HUNYUAN-MT赋能Agent智能体:构建具备多语言交互能力的AI助手 想象一下,你正在开发一个面向全球用户的智能客服助手。一位法国用户用法语咨询产品问题,一位日本用户用日语询问订单状态,而你的核心业务逻辑和知识库大部分是中文的。…...
HexView脚本进阶:巧用/CR参数实现多区域数据‘挖空’,为自动化测试铺路
HexView脚本进阶:巧用/CR参数实现多区域数据‘挖空’,为自动化测试铺路 在自动化测试领域,二进制文件的预处理往往决定了测试的深度和效率。想象一下这样的场景:你手头有一份完整的ECU固件文件,但为了验证设备在数据损…...
