1.有重复的排列问题
例题:用3,2,1这三个数字组成一个4位数,数字可以重复。
这里显然有3的4次方种可能性,可以用递归实现如下:
void quanpailie1(int a[],int i,int n) { //i = n 则说明其排列结束可以输出 if(i == n) { for(int i = 0;i < n; i++) { cout << a[i] ; } count++; cout<<endl; } else { //这里分三种情况进行全排列 a[i] = 1; quanpailie1(a, i + 1, n); a[i] = 2; quanpailie1(a, i + 1, n); a[i] = 3; quanpailie1(a, i + 1, n); } } int main() { int a[4]; quanpailie1(a, 0, 4); cout<< "共 " << pailie_num << " 种可重复排列!" <<endl; system("PAUSE"); return 0; }
例题有{a1,a2,...,an}数组,试输出该数组的所有组合。
这里可得每一个数均有放入子集和不放入子集两种情况。
故共有2的n次方种子集(包含空集),若不包含空集则有2的n次方减一种情况
Sample Input
4
1 2 3 4
Sample Output
1
12
123
1234
124
13
134
14
2
23
234
24
3
34
4
//这里a[]表示的是选择情况, //a[i] = 0 表示a2[i]不选择,a[i] = 1 表示a2[i]选择 void quanzuhe(int a[],int i,int n,int a2[]) { if(i == n) { int num = 0; for(int i = 0;i < n; i++) { if(a[i] == 1) { cout << a2[i]; num++; } } if(num != 0) cout<<endl; } else { a[i] = 1; quanzuhe(a, i + 1, n, a2); a[i] = 0; quanzuhe(a, i + 1, n, a2); } } int main() { int a[3]; int a2[3] = {1,2,3}; quanzuhe(a, 0, 3, a2); system("PAUSE"); return 0; }
例如{1,2,3,4,5}中选择三个,可以使用上面的代码稍加修改即可实现
//这里m表示需要从中选择几个 void zuhe(int a[],int i,int n,int a2[], int m) { if(i == n) { int num = 0; for(int i = 0; i < n; i++) { if(a[i] == 1) { num++; } } if(num == m) { for(int i = 0; i < n; i++) { if(a[i] == 1) { cout<<a2[i]; } } cout<<endl; } } else { a[i] = 1; zuhe(a, i + 1, n, a2, m); a[i] = 0; zuhe(a, i + 1, n, a2, m); } } int main() { int a[5]; int a2[5] = {1,2,3,4,5}; zuhe(a, 0, 5, a2, 3); system("PAUSE"); return 0; }
static int g_sCnt = 0; //permutation的重载版本. void permutation(char* pStr, char* pBegin) { if(*pBegin == '\0') { ++g_sCnt; cout << pStr << endl; } else { for(char* pCh = pBegin; *pCh != '\0'; ++pCh) { //从第一个字符依次和后面的字符进行交换. char temp = *pCh; *pCh = *pBegin; *pBegin = temp; permutation(pStr,pBegin+1); //交换回原样,以便再递归处理后面的字符. temp = *pCh; *pCh = *pBegin; *pBegin = temp; }//end for }//end else } //全排列处理函数 void permutation(char* pStr) { if(pStr== NULL) { return; } else { permutation(pStr,pStr); } } int main() { char strSrc[] = "abc"; permutation(strSrc); cout<< "共 " << g_sCnt << " 种排列!" <<endl; system("PAUSE"); return 0; }