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,则停止递归;此外,当当前选择的数超过剩余选择数时,也停止递归。每选择一个数后,将其标记为已选,并递归选择下一个数。

代码实现:

#include 
using 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,程序应能正确生成所有组合,按字典序排列输出,如预期输出,确保程序无误。

上一篇:AcWing 94 递归实现排列型枚举
下一篇:2024年薪酬最高的五个网络安全职位,来看看有没有你想从事的岗位

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2025年05月07日 08时06分19秒