组合排列

排列: 1. 全排列就是从第一个数字起每个数分别与它后面的数字交换。
        2. 去重的全排列就是从第一个数字起每个数分别与它后面非重复出现的数字交换。
        3. 将待排列字符排序,然后从小到大找出所有字符,即为其全排列

组合: 1. 扫描字符串中的一个字符。 
        2. 第一是把这个字符放到组合中去,接下来在剩下的n-1个字符中选取m-1个字符
        3. 第二是不把这个字符放到组合中去,接下来在剩下的n-1个字符中选择m个字符
        4. 循环1,2,3  
        5. 0,1位运算法        

 

例子下面是递归方法的实现:
 1) 求从数组a[1..n]中任选m个元素的所有组合。
 2) a[1..n]表示候选集,n为候选集大小,n>=m>0。
 3) b[1..M]用来存储当前组合中的元素(这里存储的是元素下标),
 4) 常量M表示满足条件的一个组合中元素的个数,M=m,这两个参数仅用来输出结果。

void combine(int a[], int n, int m, int b[], const int M)
{ 
    for(int i=n; i>=m; i--)   // 注意这里的循环范围
    {
        b[m-1] = i - 1;
        if (m > 1)
        {
            combine(a,i-1,m-1,b,M);
        }
        else                     // m == 1, 输出一个组合
        {   
            for(int j=M-1; j>=0; j--)
                cout << a[b[j]] << " ";
            cout << endl;
        }
    }
}

 

 

posted on 2014-05-06 14:48  kangbry  阅读(202)  评论(0编辑  收藏  举报

导航