
AcWing 93 递归实现组合型枚举
发布日期:2021-05-28 16:29:46
浏览次数:20
分类:精选文章
本文共 1061 字,大约阅读时间需要 3 分钟。
题目描述:从1到n的整数中随机选择m个数字,并按升序排列输出所有可能的选择方案。方案按字典序排列,相邻行内数字按升序排列。
输入格式:两个整数n、m,用空格隔开。
输出格式:每行一个方案,数字按升序排列,方案按字典序排列。
数据范围:n>0,0≤m≤n,且n + (n - m) ≤25。
解题思路:使用深度优先搜索(DFS)生成所有可能的组合,并进行剪枝处理,使得生成过程高效且避免重复。剪枝条件包括:如果已选数数量大于m或剩余可选数加已选数小于m,则停止递归;此外,当当前选择的数超过剩余选择数时,也停止递归。每选择一个数后,将其标记为已选,并递归选择下一个数。
代码实现:
#includeusing namespace std;void dfs(int cur, int k, int st) { if (cur == n || k > m) { if (k == m) { // 生成组合字符串 ostringstream oss; for (int i = 0; i < n; i++) { if ((st >> (1 << i)) & 1) { oss << (i + 1); if (i != n - 1) oss << ' '; } } cout << oss.str() << endl; } return; } // 剪枝条件:如果已经选了超过m个数或者不能满足剩余需要选的数量 if (k + n - cur - st_bits + k < m || k + st_bits > m) { return; } // 选择当前数字 dfs(cur + 1, k + 1, st | (1 << cur)); // 不选当前数字 dfs(cur + 1, k, st);}int main() { // 读取输入 cin >> n >> m; dfs(0, 0, 0); return 0;}
测试输入输出:如输入n=5,m=3,程序应能正确生成所有组合,按字典序排列输出,如预期输出,确保程序无误。
发表评论
最新留言
逛到本站,mark一下
[***.202.152.39]2025年05月07日 08时06分19秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
反转链表,(5)
2019-03-16
Camera (api1)的打开过程
2019-03-16
wxwidgets绘图
2019-03-16
wxwidgets事件处理
2019-03-16
用OpenCv转换原始图像数据到wximage
2019-03-16
codeblocks下wxWidgets编译与配置
2019-03-16
OpenCv+wxwidgets尝试
2019-03-16
wxwidgets自定义事件+调试
2019-03-16
wxwidgets编写多线程程序--wxThread
2019-03-16
BUUCTF:[湖南省赛2019]Findme
2019-03-16
ciscn2021西北部分pwn
2019-03-17
p144循环网络
2019-03-17
Finger.01 - ESP8266模块STA模式调试
2019-03-17
三维点云处理
2019-03-17
springboot security 基于redis的session共享(7)
2019-03-17
vue 权限管理 菜单按钮权限控制(7)
2019-03-17
vue 权限管理 主题切换(8)
2019-03-17
Qt 在Excel文件中Chart绘图
2019-03-17
U3D资源加载
2019-03-17
01-webpack5理解及配置
2019-03-17