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 }