递归实现组合型枚举
递归实现组合型枚举
题目描述:
从
输入格式
两个整数
输出格式
按照从小到大的顺序输出所有方案,每行
首先,同一行内的数升序排列,相邻两个数用一个空格隔开。
其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面(例如 1 3 5 7
排在 1 3 6 8
前面)。
数据范围
输入样例:
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
解题思路:
递归求解,根据位置选数,选数顺序从小到大,无重复。
答案:
#include#include using namespace std; int m,n; int state[26]; void dfs(int u,int start)//u:递归层数其大小与所得位数相等 start:所选组合数的第一位 { if(n-start+u<m)//减枝,减少不必要的递归次数,当n-start起始位置后所剩的位置与当前位置u的和都小于m代表选不满无法继续递归 return; if(u==m+1)//递归出口,已经选满了m个数 { for(int i=1;i<=m;i++) printf("%d ",state[i]); puts(""); return; } for(int i=start;i<=n;i++)//从起始位置开始递归 { state[u]=i; dfs(u+1,i+1); state[u]=0; } } int main() { cin>>n>>m; dfs(1,1); return 0; }