全组和问题

 1 #include <iostream>
 2 #include <string>
 3 #include <vector>
 4 #include <queue>
 5 #include <algorithm>
 6 #include <cstdio>
 7 using namespace std;
 8 
 9 #define MAX_N 10
10 int n; //共n 个数
11 int rcd[MAX_N]; // 记录每个位置填的数
12 int num[MAX_N]; // 存放输入的n 个数
13 int usd[MAX_N];
14 void full_combination(int l, int p) {
15     int i;
16     for (i = 0; i < l; i++) { //每次进入递归函数都输出
17         printf("%d", rcd[i]);
18         if (i < l - 1)
19             printf(" ");
20     }
21     printf("\n");
22     for (i = p; i < n; i++) { // 循环同样从p 开始,但结束条件变为i>=n
23         rcd[l] = num[i]; // 在l 位置放上该数
24         full_combination(l + 1, i + 1); //填下一个位置
25     }
26 }
27 int read_data() {
28     int i;
29     n = 3;
30     for (i = 0; i < n; i++) {
31         num[i] = i;
32         usd[i] = 3;
33     }
34     return 1;
35 }
36 int main() {
37     read_data();
38     full_combination(0, 0);
39     return 0;
40 }

不重复的全组和

 1 #include <iostream>
 2 #include <string>
 3 #include <vector>
 4 #include <queue>
 5 #include <algorithm>
 6 #include <cstdio>
 7 using namespace std;
 8 
 9 #define MAX_N 10
10 int n, m; //输入n 个数,其中本质不同的有m 个
11 int rcd[MAX_N]; // 记录每个位置填的数
12 int used[MAX_N]; // 标记m 个数可以使用的次数
13 int num[MAX_N]; // 存放输入中本质不同的m 个数
14 void unrepeat_combination(int l, int p) {
15     int i;
16     for (i = 0; i < l; i++) { //每次都输出
17         printf("%d", rcd[i]);
18         if (i < l - 1)
19             printf(" ");
20     }
21     printf("\n");
22     for (i=p; i<m; i++) //循环依旧从p 开始,枚举剩下的本质不同的数
23     if (used[i] > 0) { // 若还可以用, 则可用次数减
24         used[i]--;
25         rcd[l] = num[i]; //在l 位置放上该数
26         unrepeat_combination(l + 1, i); //填下一个位置
27         used[i]++; //可用次数恢复
28     }
29 }
30 int read_data() {
31     int i;
32     n = 3;
33     m=3;
34     for (i = 0; i < n; i++) {
35         num[i] = i;
36         used[i] = i+1;
37     }
38 
39     return 1;
40 }
41 int main() {
42     read_data();
43     unrepeat_combination(0,0);
44     return 0;
45 }
原文地址:https://www.cnblogs.com/kakamilan/p/2622856.html