很多地方都遇过排列组合,比如计算问题的规模,数据的大小,占用磁盘空间多少等。
原理部分借鉴网上一篇文章,道理已经说的很清楚就不重复了。
(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}。
以此类推,把所有可能的情况取一遍,就是全排列了,如图:
#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)() << endl;
int i=0;
for(vector<vector<int> >::iterator lt=();lt<();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;
}
组合部分待续。。
参考:
/autosar/archive/2012/04/08/
/shuxue/jiangjie/
http:///content/10/0426/08/1217123_24908058.shtml