全排列算法(递归实现) 组合算法(递归,位运算实现)

来源:互联网 发布:淘宝网中老年人女装 编辑:程序博客网 时间:2024/06/03 18:10

//……………………………..全排列…………………….

#include<iostream>using namespace std;//判断要交换的两个数是否相等,如果相等就不进行交换bool IsSwap(int list[],int begin,int end){    for(int i = begin;i<end;i++)        if(list[i] == list[end])            return false;        return true;}void Perm(int list[],int k,int m){    if(k == m)    {        for(int i =0;i<m;i++)            cout<<list[i];        cout<<endl;    }    else    {        for(int i = k;i<m;i++)        {            if(IsSwap(list,k,i))              {                swap(list[k],list[i]);                 Perm(list,k+1,m); //递归计算k+1到m的全排列                swap(list[k],list[i]);            }        }    }}int main(){    int arr[] = {1,2,2};    cout<<"arr数组全排列的结果是:"<<endl;    Perm(arr,0,3);    return 0;}

//………………………………….组合算法………………………………
//………………………1.递归方式实现
/*
解题思路:因为要求集合里的元素所能够组成的所有组合,所以我们需要遍历该集合,
这里假设我们的集合为”abc”,从头扫描集合里的元素,第一个元素为a,对于这个元素,
有两种选择,一种是将字符放到组合中,然后在剩下的n-1个字符中选取m-1个字符
另一种是不把字符放到组合中去,接下来需要在剩下的n-1个字符中选取m个字符
*/

#if 1void Combination(char* string,int number,vector<char>& result){    if(number == 0)    {        vector<char>::iterator iter = result.begin();        for(;iter<result.end();++iter)            cout<<*iter;        cout<<endl;        return ;    }    if(*string == '\0')        return ;    result.push_back(*string);    Combination(string+1,number-1,result); //将字符放到组合当中    result.pop_back();    Combination(string+1,number,result);  //不把字符放到组合当中}void Combination(char* string){    if(string == NULL)        return ;    int length = strlen(string);    vector<char>result;    for(int i = 1;i<=length;++i)    {        Combination(string,i,result);    }}int main(){    char* string = "abcd";    Combination(string);    return 0;}#endif

//………………………..2.位运算…………..
分析组合规律可以发现,
当集合个数为2时,有3(2^2-1)种组合方式;
当集合个数为3时,有7(2^3-1)种组合方式;
当集合个数为4时,有15(2^4-1)种组合方式;
又直到1<

#if 1int main(){    string s ;    cin>>s;    int len = s.size();    int bit = 1<<len;  //所有组合种类个数    int t;    //两个for循环依次将所有组合情况列举出来    for(int i= 0;i<bit;i++)    {        for(int j = 0;j<len;j++)        {            t = 1<<j;            if((t&i)!=0)            {                cout<<s[j];            }        }        cout<<endl;    }}#endif