当前位置: 首页 > 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())
vis = [False]*(n+1)
# 从答案的视角
def dfs(i):
  if len(path) == m:
    print(*path,sep=" ")
    return 
  # 从答案视角进行枚举
  for j in range(i,n+1):
    if not vis[j]:
      vis[j] = True
      path.append(j)
      dfs(j+1)
      # 恢复现场
      path.pop()
      vis[j] = False
# 调用
dfs(1)
  • 也可以从输入视角,但是最后得进行调整顺序,因为我们最后得到的是正规答案的倒序的情况,注意这个最后更新答案与最终终止的条件的顺序,应该是先判断path的长度是否是m,再判断接下来是否还需要进行接着遍历
import os
import sys

path = []
# 定义几个状态,当前答案的数目
n, m = map(int, input().split())
vis = [False] * (n + 1)


# 从输入视角,会发现这个输出的答案是按照字典序倒序输出的
# 所以考虑先将答案存起来,再倒着输出
ans = []
def dfs(i):
    if len(path) == m:
        ans.append(path.copy())
        return
        # 从输入视角
        # 不选当前的元素
    if i == n+1:
        return
    dfs(i + 1)
    if not vis[i]:
        vis[i] = True
        path.append(i)
        dfs(i + 1)
        path.pop()
        vis[i] = False
# 调用
dfs(1)
for i in range(len(ans)-1, -1, -1):
    print(*ans[i],sep=" ")

相关文章:

  • Kubernetes Pod 生命周期详解 之 探针
  • 函数(函数的概念、库函数、自定义函数、形参和实参、return语句、数组做函数参数、嵌套调用和链式访问、函数的声明和定义、static和extern)
  • 【面试题系列】Redis 常见面试题答案
  • 蓝桥杯备考:数据结构堆之第k小
  • mapbox高阶,结合threejs(threebox)添加extrusion挤出几何体
  • LeeCode题库第四十九题
  • ES6 字符串和正则表达式
  • 72. 编辑距离
  • 线性搜索算法
  • 《几何原本》命题I.31
  • JVM常用概念之代际障碍
  • Selenium的免登录和滚动条到底部的学习总结(3)
  • 焕新|16GB+1TB 、UV 双段,AORO M8 防爆手机安全性能双升级
  • 使用pnpm管理前端项目依赖
  • 数字IC后端项目典型问题(2025.03.10数字后端项目问题记录)
  • SQL Server 列存储索引:大幅提升查询性能的利器
  • TDengine 配置 ODBC 数据源
  • c#如何直接获取json中的某个值
  • Bad owner or permissions on ssh/config - 解决方案
  • 表、索引统计信息锁定和解锁
  • 上海位居全球40城科技传播能力第六名
  • 纪念|脖子上挂着红领巾的陈逸飞
  • 张巍任中共河南省委副书记
  • 陕西省市监局通报5批次不合格食品,涉添加剂超标、微生物污染等问题
  • 美国务卿鲁比奥抵达会场,将参加俄乌会谈
  • 350种咖啡主题图书集结上海,20家参展书店买书送咖啡