从 1~n 这 n 个整数中随机选出 m 个,输出全部可能的选择方案。spa
两个整数n,m在同一行用空格隔开。code
按照从小到大的顺序输出全部方案,每行1个。blog
首先,同一行内的数升序排列,相邻两个数用一个空格隔开。递归
其次,对于两个不一样的行,对应下标的数一一比较,字典序较小的排在前面(例如1 3 5 7排在1 3 6 8前面)。it
n>0,
0≤m≤n,
n+(n−m)≤25io
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 <cstdio> const int N = 30; int way[N]; int n, m; void dfs(int u, int start) //u:表示枚举位置,start:表示枚举位置的值的最小值 { if (u + n - start < m ) return; //剪枝 if ( u == m + 1) { for (int i = 1; i <= m; i ++) printf("%d ", way[i]); printf("\n"); return; } for (int i = start; i <= n; i ++) { way[u] = i; dfs(u + 1, i + 1); way[u] = 0; } } int main() { scanf("%d %d", &n, &m); dfs(1, 1); return 0; }