#包含
#包含
#包含
#包含
#包含
用户命名空间STD;
//method1
布尔标志[5];
intarr [5]={ 1,2,3,4,5 };
intlen=sizeof(arr )/sizeof ) int;
语音通信(intn,int count );
//
//method2
voidcomB2(intn,int count;
向量结果;
//method3:
voidcomB3(intn,int count;
intgetcombcount(intn,int m );
//3
void GetCharComb (;
//4
int data [3]={ 1,2,3 };
int data1 [3]={ 4,2,3 };
语音性能(int * a,int len );
voidSTL_Permutaton(int*a,int len );
//要求全幂集,依次取comb (4,1 ) comb ) 4,2 ) comb ) 4,5 )空集
//5
int num=0;
voidpermutation(intarray[],int begin,int end );
int main () )
{
向量结果;
for(intI=0; i5; I )
flag[i]=false;
cout '---递归组合1 (根据标志位打印每个组合)----' endl;
Comb (4,3 );
cout '---递归组2 (将每个组保存到容器中)---' endl;
Com B2 (4,1 );
cout '---非递归组合---' endl;
Com B3 (5,3 );
cout '---字符串的所有组合(幂集合中除空字符串外)----' endl;
GetCharComb (;
cout '---非递归数组---' endl;
性能(数据,3 );
cout '----STL完整序列--' endl;
STL _ permutaton (data1,3 );
出局了
inta [3]={ 2,3,4 };
permutation(a,0,sizeof(a )/sizeof(int )- 1 );
返回0;
}
语音信箱(intn,int count ) )。
{
if (计数==0)
{
//simiarwithselectusingvectorstorageselecteddatawillbesimilarwithepoll
for(intI=0; I
if(flag[I]==true ) ) ) ) )。
cout arr[i] ';
cout endl;
返回; //-退出条件1-- (递归终止条件1 ) )。
}
if(n0 )//exit condition 2 --(递归终止条件2 ) ) ) )。
返回;
flag[n]=true;
COMB(n-1,count-1 );
flag[n]=false;
COMB(n-1,count );
}
voidcomB2(intn,int count ) )。
{
if (计数==0)
{
//每次递归结束时所要求的组合,
vector:iterator it;
for(it=result.begin ); it result.end (; it ) /
cout *it ';
cout endl;
返回;
}
是if(N0 )
ret
urn;result.push_back(arr[n]);
Comb2(n-1,count-1);
result.pop_back();
Comb2(n-1,count);
}
/*
用一个数组,模拟2进制加法器,某一个为1,则取对应的字符,若为0则不取,就能够实现字符组合。也可以不用数组。设有n个字符。
int num 从 1 自增到 2^n -1, 将num右移i位,跟1做按位&操作,即可判断第i个字符取还是不取。
001 010 011 100 101 110 111
c b bc a ac ab abc
//还存在的问题的是符数组的长度<32的话这个办法还是很不错的,如果>32就需要原始方法了。
*/
void GetCharComb()
{//求幂集
//string str= "aabc";
string str = "abc";
int N = str.size();
int num = pow(2.0,N) ;// (2.0 N)
for(int i=1;i
{
for(int j=0;j
{
if((i>>j)&1)//tips ----:检测为1的bit位
cout<
}
cout<
}
}
/*
字典序变化(1234----> 4321)
1.从最右边开始比较两两相邻的元素,直至找到右边比左边大的一对,左边那个
2.就是将要被替换的,再从最右边开始找比这个元素大的第一个,交换他们两个
3.交换之后,翻转交换元素的后面的所有元素
*/
void permutation(int *a,int len)
{
int i,j;
int tmp;
int num = 6;//1*2*3
copy(arr,arr+len,ostream_iterator(cout," "));
cout << endl;
for(i=len-1;i>0;i--)
{
if(a[i] > a[i-1])// i-1 【1】
{
for(j = len-1;j>=0;j--)
if(a[j] > a[i-1])//【2】
{
tmp = a[i-1];
a[i-1] = a[j];
a[j] = tmp;
//【3】
int m = i,n = len-1;
while(m<=n)
{
tmp = a[m];
a[m] = a[n];
a[n] = tmp;
m++;
n--;
}
break;
}
i = len;//begin again
copy(a,a+len,ostream_iterator(cout," "));
cout << endl;
}
}
}
void stl_permutaton(int *a,int len)
{//字典序的第一个序列必须递增
sort(a,a+len);
do
{
copy(a,a+len,ostream_iterator(cout," "));
cout << endl;
}while(next_permutation(a,a+len));
}
/*
思路:
(A、B、C、D)的全排列为
1、A后面跟(B、C、D)的全排列
2、B后面跟(A、C、D)的全排列
3、C后面跟(A、B、D)的全排列
4、D后面跟(A、B、C)的全排列
而对1中的(B、C、D)照样可以按照上面的形式进行分解。
*/
void permutation(int array[], int begin, int end)
{
int i;
if(begin == end){//递归退出条件 处理最后一个元素了
num ++;
//cout << end << endl;
for(i = 0; i <= end; ++i){
cout<
}
cout<
return;
} else {
//for循环遍历该排列中第一个位置的所有可能情况
for(i = begin; i <= end; ++i) {
swap(array[i], array[begin]);
permutation(array, begin + 1, end);
swap(array[i], array[begin]);//还原数组 继续下一次遍历
}
}
}
//Non-Recursive method to get combination
void Comb3(int n,int count)
{/*
递减最小变化:
从右往左找第一对10交换,表示我想把数变小
但我我希望减小的最少,则交换点后面的数要尽量大,所以把1全部移到交换点后的高位
11100
11010
11001
10110
10101
10011
01110
01101
01011
00111
*/
//int bit[5] = {1,1,1,0,0};//initial bit array
int *bit = new int[n];
for(int k = 0;k
{
if(k
bit[k] = 1;
else
bit[k] = 0;
}
int i,j,beg,end;
int len = sizeof(arr)/sizeof(int);
int N = GetCombCount(n,count); //C(n,count) C(5,3)
for(i = 0;i
if(bit[i] == 1)
cout << arr[i];
cout << endl;
for(j = 1;j<=N-1;j++)
{
for(i = len-1;i>0;i--)
{
if(bit[i] == 0 && bit[i-1] == 1)
{
swap(bit[i],bit[i-1]);
//from index: [i to len-1] , make all bit 1 in the right
beg = i;
end = len - 1;
while(1)
{
while(bit[beg] == 1)
{
beg ++;
if(beg >= len)
break;
}
while(bit[end] == 0)
{
end --;
if(end
break;
}
if(beg < end)
swap(bit[beg],bit[end]);
else
break;
}//end of "while"
break;
}//end of "if"
//copy(bit,bit+5,ostream_iterator(cout," "));
//cout <
}
for(i = 0;i
if(bit[i] == 1)
cout << arr[i];
cout << endl;
}
}
int GetCombCount(int n,int m)
{
int i;
int a,b,c,s;// s = a/(b*c)
a = b = c =1;
for(i = 1;i<=n;i++)
a*=i;
for(i = 1;i<=m;i++)
b*=i;
for(i = 1;i<=n-m;i++)
c*=i;
s = a/(b*c);
return s;
}