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;
}
2.生成全子集的组合问题
例题有{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;
}
3.生成指定个数的组合问题
例如{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;
}
4.全排列问题
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;
}