当前位置: 首页 > news >正文

搜索 之 组合问题

文章目录

  • 题目
    • 递归实现组合型枚举

  • 常见的搜索的问题包括求解子集、求解组合数、求解排列以及其他的相关的问题
  • 下面补充我的关于求解子集和求解排列的另一篇博客

搜索之 排列 与 子集

  • 本章节就来介绍这个 搜索的组合问题
  • 组合问题,顾名思义,也就是从从n个元素中挑选m个数,在一个组合当中,一个数只能被挑选一次,细分来说,简单来说这个n个元素可以是1-n的数,要是想设置哪一点,也可以是一个集合当中的数,对于组合,当然是里面的数的顺序是不管的,那么区别与这个排列,对应的细节应该如何处理?
    • 实际处理的时候,并不要关注这个是否可以从输入的视角还是从答案的视角,只需关注这个关注这个,初始状态,结束条件,以及到达下一个状态的转移关系,其实感觉这个才是正统的关系细细品味,感觉就是从答案视角;从输入的视角也可以解决,但是也会麻烦一点
    • 对于处理组合数当中的顺序无关所带来的重复性的问题,我们只需在选择元素的时候,规定后面的选择的下标只能大于当前的下标,那么就可以避免这个重复性的问题

题目

递归实现组合型枚举

在这里插入图片描述

  • 组合方案的模版题目

从答案视角进行枚举递归

  • 定义dfs(i)为从当前元素开始遍历枚举
  • 开始的状态就是 dfs(i)
  • 结束的状态就是len(path)==k,也就是满足这个组合的长度限制
  • 状态的转移从当前的range(i,n+1)中选择一个没有被选过的元素加入path,同时标记这个元素,dfs(j+1),然后恢复现场
import os
import sys
path = []
# 定义几个状态,当前答案的数目
n,m = map(int,input().split())
# 从答案的视角
def dfs(i):if len(path) == m:print(*path,sep=" ")return # 从答案视角进行枚举for j in range(i,n+1):if not vis[j]:path.append(j)dfs(j+1)# 恢复现场path.pop()
# 调用
dfs(1)
  • 也可以从输入视角,但是最后得进行调整顺序,因为我们最后得到的是正规答案的倒序的情况,注意这个最后更新答案与最终终止的条件的顺序,应该是先判断path的长度是否是m,再判断接下来是否还需要进行接着遍历
import os
import syspath = []
# 定义几个状态,当前答案的数目
n, m = map(int, input().split())# 从输入视角,会发现这个输出的答案是按照字典序倒序输出的
# 所以考虑先将答案存起来,再倒着输出
ans = []
def dfs(i):if len(path) == m:ans.append(path.copy())return# 从输入视角# 不选当前的元素if i == n+1:returndfs(i + 1)if not vis[i]:path.append(i)dfs(i + 1)path.pop()
# 调用
dfs(1)
for i in range(len(ans)-1, -1, -1):print(*ans[i],sep=" ")

http://www.mrgr.cn/news/94072.html

相关文章:

  • 知识库全链路交互逻辑
  • Linux - 磁盘分区、挂载
  • 自动化测试介绍及学习路线
  • 【贪心算法3】
  • HTMLCSS绘制三角形
  • ubuntu20.04 使用linuxdeployqt打包一个QT程序
  • 数据结构(蓝桥杯常考点)
  • 学习知识的心理和方法杂记-03
  • 安卓Android与iOS设备管理对比:企业选择指南
  • 【LangChain】理论及应用实战(3)
  • java-单列模式-final-枚举
  • 保姆级别使用Python实现“机器学习“案例
  • osg安装编译第三方,完整详细过程。 libtiff/tif config.vc.hdoes not exist
  • 【Golang】第一弹-----初步认识GO语言
  • 【A2DP】蓝牙A2DP协议剖析:从架构到规范
  • centos 7 安装apache服务
  • upload-labs-master通关攻略(17~19)
  • 瑞芯微RK3576(1)-硬件设计
  • DeepIn Wps 字体缺失问题
  • 暑期第一面oωo, TME一面面经