ACWing93.递归实现组合型枚举
题面
\93. 递归实现组合型枚举
从 1∼n
这 n 个整数中随机选出 m
个,输出所有可能的选择方案。
输入格式
两个整数 n,m
,在同一行用空格隔开。
输出格式
按照从小到大的顺序输出所有方案,每行 1
个。
首先,同一行内的数升序排列,相邻两个数用一个空格隔开。
其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面(例如
1 3 5 7
排在1 3 6 8
前面)。数据范围
n>0
,
0≤m≤n ,
n+(n−m)≤25输入样例:
5 3 输出样例:
1 2 3 1 2 4 1 2 5 1 3 4 1 3 5 1 4 5 2 3 4 2 3 5 2 4 5 3 4 5 思考题:如果要求使用非递归方法,该怎么做呢?
题解
搜索以及剪枝(就是在发现已经不可能得到解的情况下立即返回,可以使时间复杂度大大地下降)
题目中所给的顺序,可以直接使用DFS的顺序来实现。
剪枝的条件:当已经选了的大于了M或者再加上剩下要选的都不能达到M。
代码——使用递归算法
#include <bits/stdc++.h> using namespace std; int n, m; vector<int> chosen; void DFS(int x) { if(chosen.size() > m || chosen.size() + (n-x+1) < m) return; if(chosen.size() == m)//要注意 { for(int i = 0; i < chosen.size(); i++) { printf("%d ", chosen[i]); } putchar(10); return; } chosen.push_back(x); DFS(x+1); chosen.pop_back(); DFS(x+1); } int main() { scanf("%d%d", &n, &m); DFS(1); return 0; }
使用非递归算法
#include <bits/stdc++.h> using namespace std; vector<int> chosen; int top = 0; int address =0 ; //int stac[100]; int stac[100010]; void call(int x, int ret_address) { int old_top = top; stac[++top] = x; stac[++top] = ret_address; stac[++top] = old_top; } int ret() { int ret_address = stac[top-1]; top = stac[top]; return ret_address; } int m, n; int main() { scanf("%d%d", &n, &m); call(1, 0); while(top) { int x = stac[top-2]; switch(address) { case 0: if(chosen.size() > m || chosen.size() + (n-x+1) < m) { address = ret(); continue; } if(chosen.size()==m) { for(int i = 0; i < chosen.size(); i++) { printf("%d ", chosen[i]); } putchar('\n'); address = ret(); continue; } chosen.push_back(x); call(x+1, 1); address = 0; continue; case 1: chosen.pop_back(); call(x+1, 2); address = 0; continue; case 2: address = ret(); continue; } } return 0; }
本文来自博客园,作者:心坚石穿,转载请注明原文链接:https://www.cnblogs.com/xjsc01/p/16438228.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~