C++实现排列组合

 很多地方都遇过排列组合,比如计算问题的规模,数据的大小,占用磁盘空间多少等。

原理部分借鉴网上一篇文章,道理已经说的很清楚就不重复了。

(1) 全排列:

全排列表示把集合中元素的所有按照一定的顺序排列起来,使用P(n, n) = n!表示n个元素全排列的个数。

例如:{1, 2, 3}的全排列为:

 

123;132;

213;231;

312;321;

共6个,即3!=3*2*1=6。

这个是怎么算出来的呢?

首先取一个元素,例如取出了1,那么就还剩下{2, 3}。

然后再从剩下的集合中取出一个元素,例如取出2,那么还剩下{3}。

以此类推,把所有可能的情况取一遍,就是全排列了,如图:

perm

 

#include <iostream>
#include <vector>
#include <vector>
using namespace std;

#define MAX_SIZE 5

void swap(vector<int> &lst, int i, int j)
{
   int tmp = lst[i];
   lst[i] = lst[j];
   lst[j] = tmp;
}


void perm(vector<int> &lst, int start, int end, vector<vector<int> > &dst)
{
    if (start >= end) {
        dst.push_back(lst);
    } else {
        for (int i=start;i<end;i++) {
            swap(lst, start, i);
            perm(lst, start+1, end, dst);
            swap(lst, start, i);
        }
    }
}


int
main(int argc, const char *argv[])
{
    vector<vector<int> > dst;
    vector<int> lst;
    for(int i=0;i<MAX_SIZE;i++) {
        lst.push_back(i);
    }

    perm(lst, 0, MAX_SIZE, dst);
    cout << "len " << (int)dst.size() << endl;
    int i=0;
    for(vector<vector<int> >::iterator lt=dst.begin();lt<dst.end();lt++){
            cout << i << ": ";
        for(vector<int>::iterator it=(*lt).begin();it < (*lt).end(); it++) {
            cout << *it;
        }
        cout << endl;
        i++;
    }
    cout << endl;
    return 0;
}


排列计算公式

 

从n个不同元素中,任取m(m≤n)个元素按照一定的顺序排成一列,叫做从n个不同元素中取出m个元素的一个排列;从n个不同元素中取出m(m≤n)个元素的所有排列的个数,叫做从n个不同元素中取出m个元素的排列数,用符号 p(n,m)表示.

p(n,m)=n(n-1)(n-2)……(n-m+1)= n!/(n-m)!(规定0!=1).

附上计算公式的代码:

 

#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;

long factorial(int num)
{
    long result=1;
    for(int i=1;i<=num;i++){
        result*=i;
    }
    return result;
}

long pnm(int num, int len)
{
    return factorial(num)/len*factorial(num-len);
}

int
main(int argc, const char *argv[])
{
    if (argc < 2)  {
        printf("usage:%s num", argv[0]);
        return 0;
    }

    //printf("%s", argv[1]);
    //return 0;
    int num=atoi(argv[1]);
    long result = factorial(num);
    cout << "factorial result :" <<result<<endl;

    cout << "pnm result :" << pnm(10, 9)<<endl;    
    return 0;
}

 

组合部分待续。。

 

 

 

参考:

http://www.cnblogs.com/autosar/archive/2012/04/08/2437799.html

http://www.ixuela.com/shuxue/jiangjie/18300.html

http://www.360doc.com/content/10/0426/08/1217123_24908058.shtml

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值