首页 > 编程知识 正文

c语言排列组合算法(c语言组合数公式计算)

时间:2023-05-05 10:29:42 阅读:68148 作者:1501

#包含

#包含

#包含

#包含

#包含

用户命名空间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;

}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。