南阳32--组合数(Dfs)

组合数

时间限制:3000 ms  |  内存限制:65535 KB
难度:3
 
描述
找出从自然数1、2、... 、n(0<n<10)中任取r(0<r<=n)个数的所有组合。
 
输入
输入n、r。
输出
按特定顺序输出所有组合。
特定顺序:每一个组合中的值从大到小排列,组合之间按逆字典序排列。
样例输入
5 3
样例输出
543
542
541
532
531
521
432
431
421
321
来源
[苗栋栋]原创
上传者
苗栋栋
ac:
 1 #include <cmath>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <iostream>
 5 using namespace std;
 6 int dis[15], vis[15], m, n;
 7 void Dfs(int a, int b)
 8 {
 9     if(b == n + 1)
10     {
11         for(int i = 1; i <= n; i++)
12             printf("%d", dis[i]);
13         printf("
");
14         return;
15     }
16     for(int i = a; i > 0; i--)   //保证顺序; 
17     {
18         if(vis[i])
19         continue;
20         vis[i] = 1;
21         dis[b] = i;
22         Dfs(i-1, b+1);       //递归; 
23         vis[i] = 0;          //回溯; 
24     }
25 }
26 int main()
27 {
28     while(~scanf("%d %d", &m, &n))
29     {
30         memset(vis, 0, sizeof(vis));
31         Dfs(m, 1);   //传参, “1” 为dis[]数组中以1为下标存第一个数: 
32     }
33     return 0;
34 } 
 
原文地址:https://www.cnblogs.com/soTired/p/4705925.html