排 列 组 合 公 式 及 排 列 组 合 算 法 ( 2 0 2 0 )

  • 格式:pdf
  • 大小:138.18 KB
  • 文档页数:5

下载文档原格式

  / 5
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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