排 列 组 合 公 式 及 排 列 组 合 算 法 ( 2 0 2 0 )
- 格式:pdf
- 大小:138.18 KB
- 文档页数:5
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}。
以此类推,把所有可能的情况取一遍,就是全排列了,如图:#include iostream
#include vector
#include vector
using namespace std;
#define MAX_SIZE 5
void swap(vectorint lst, int i, int j)
int tmp = lst[i];
lst[i] = lst[j];
lst[j] = tmp;
void perm(vectorint lst, int start, int end, vectorvectorint dst)
if (start = end) {
dst.push_back(lst);
for (int i=start;iend;i++) {
swap(lst, start, i);
perm(lst, start+1, end, dst);
swap(lst, start, i);
main(int argc, const char *argv[])
vectorvectorint dst;
vectorint lst;
for(int i=0;iMAX_SIZE;i++) {
lst.push_back(i);
perm(lst, 0, MAX_SIZE, dst);
cout "len " (int)dst.size() endl;
for(vectorvectorint ::iterator lt=dst.begin();ltdst.end();lt++){
cout i ": ";
for(vectorint::iterator it=(*lt).begin();it (*lt).end(); it++) {
cout *it;
cout endl;
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);
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 :" resultendl;
cout "pnm result :" pnm(10, 9)endl;
return 0;
组合部分待续。。
for(int i=0; idata.size(); i++) {
for(inti=0;il.size();i++){
void dfs(int pos, int cnt, int n, int k, int a[],bool visited[]) {
排列与组合是常用的数学方法,其中组合就是从n个元素中抽出r个元素(不分顺序且r=n),我们可以简单地将n个元素理解为自然数1,2,…,n,从中任取r个数。
其中{5,3,1,2,2}就是他们的系数,系数与整数一一对应。每个整数有唯一的系数和其对应。
需要注意的是,只要每种元素的数目大于r,对于r组合来说就是无限多的。
public static ListListT GetCombinationListT(ListT elements,int m)
由1、2、3、4、5可以组成多少个没有重复的数字,并且大于21300的正整数?
然后调用SubSet(char *List, 1, char *Buffer, 1)把Buffer[1]=c
mo stretchy="false"(-mo