直接实现排列较为难,可以先实现全排列和组合,在组合的每个结果中调用全排列函数,可以较为直观实现非全排列的实现。

我们先来实现组合:对C(N,M),如果M已知,则直接写M值已知,则直接写M个嵌套循环即可实现。例如,M=3:

for(int i=0;i<len;i++)for(int j=i+1;j<len;j++)for(int k=j+1;k<len;k++){//do}

对于M值未知的情况,则可以用递归实现组合。

void Combination(vector<int> &a, vector<int> &b, int l, int m, int M){//b用于临时存储结果。len(b)==M;l为左侧游标,初始值取0;M是取出个数;m用于指示递归深度,初始值取M)int N = a.size();if (m == 0) {for (auto i : b){cout << i << ' ';}cout << endl;return;}for (int i = l; i < N; i++){b[M-m] = a[i];Combination(a, b,i+1,m - 1,M);}
}

下面实现全排列,全排列可以自己实现,也可以使用stl算法。自己实现全排列算法,也是使用递归,但是比组合要多一步回溯:

void Permutation(vector<int> &a, vector<int> &b, int l){//b用于临时存储结果。len(b)=len(a),l为左侧游标,初始值取0int len = a.size();if (l == len) { for (auto i : b){cout << i << ' ';}cout << endl;return; }for (int i = l; i < len; i++){b[l]= a[i];swap(a[i], a[l]);Permutation(a, b,l+1);swap(a[i], a[l]);}
}

stl的全排列:

void how_to_use_next_permutation(vector<int> &a){//使用STL 算法实现全排列auto it1 = a.begin();auto it2 = a.end();sort(it1, it2);do{for (auto i : a){cout << i << ' ';}cout << endl;}while (next_permutation(it1, it2));
}

有了组合和全排列算法,我们可以进一步写出排列:

void Arrangement(vector<int> &a, vector<int> &b, int l, int m, int M){//b用于临时存储结果。len(b)==M;l为左侧游标,初始值取0;M是取出个数;m用于指示递归深度,初始值取M)int N = a.size();if (m == 0) {vector<int> c(M);//Permutation(b, c,0);how_to_use_next_permutation(b);//cout << endl;return;}for (int i = l; i < N; i++){b[M - m] = a[i];Arrangement(a, b,i + 1, m - 1,M);}
}

全部代码如下:

#include <iostream>
#include <stdio.h>
#include <vector>
#include <list>
#include <map>
#include <algorithm>using namespace std;
void how_to_use_next_permutation(vector<int> &a);void Permutation(vector<int> &a, vector<int> &b, int l){//b用于临时存储结果。len(b)=len(a),l为左侧游标,初始值取0int len = a.size();if (l == len) { for (auto i : b){cout << i << ' ';}cout << endl;return; }for (int i = l; i < len; i++){b[l]= a[i];swap(a[i], a[l]);Permutation(a, b,l+1);swap(a[i], a[l]);}
}void Combination(vector<int> &a, vector<int> &b, int l, int m, int M){//b用于临时存储结果。len(b)==M;l为左侧游标,初始值取0;M是取出个数;m用于指示递归深度,初始值取M)int N = a.size();if (m == 0) {for (auto i : b){cout << i << ' ';}cout << endl;return;}for (int i = l; i < N; i++){b[M-m] = a[i];Combination(a, b,i+1,m - 1,M);}
}void Arrangement(vector<int> &a, vector<int> &b, int l, int m, int M){//b用于临时存储结果。len(b)==M;l为左侧游标,初始值取0;M是取出个数;m用于指示递归深度,初始值取M)int N = a.size();if (m == 0) {//vector<int> c(M);//Permutation(b, c,0);how_to_use_next_permutation(b);//cout << endl;return;}for (int i = l; i < N; i++){b[M - m] = a[i];Arrangement(a, b,i + 1, m - 1,M);}
}void how_to_use_next_permutation(vector<int> &a){//使用STL 算法实现全排列auto it1 = a.begin();auto it2 = a.end();sort(it1, it2);do{for (auto i : a){cout << i << ' ';}cout << endl;}while (next_permutation(it1, it2));
}int main(){int M = 3, N = 4;vector<int> a,b(M),c(N);for (int i = 1; i <= N; i++){a.push_back(i);}printf( "1~%d Permutation:\n",N);Permutation(a, c, 0);printf("\nM=%d, N=%d Combination:\n",M ,N);Combination(a, b, 0,M,M);printf("\nM = %d, N = %d Arrangement:\n",M ,N);Arrangement(a, b, 0,M,M);printf("\nhow_to_use_next_permutation:\n");how_to_use_next_permutation(a);while (1);
}

c++实现排列与组合相关推荐

  1. 多重集合的排列和组合问题

    多重集合的排列和组合问题 标签: permutationn2c扩展 2012-04-17 16:18 5671人阅读 评论(0) 收藏 举报  分类: 算法(12)  版权声明:本文为博主原创文章,未 ...

  2. 排列与组合的一些定理(二)

    一,容斥原理 设S是一个集合,Ai 是S 中具有性质 Pi 的元素组成的子集合.那么,S中既不具有性质P1,也不具有性质P2,...更不具有性质Pn 的元素个数为: 二,容斥原理计算 有限制的重组合问 ...

  3. 【组合数学】排列组合 ( 排列组合内容概要 | 选取问题 | 集合排列 | 集合组合 )

    文章目录 一.排列组合内容概要 二.选取问题 三.集合排列 四.环排列 五.集合组合 参考博客 : [组合数学]基本计数原则 ( 加法原则 | 乘法原则 ) [组合数学]集合的排列组合问题示例 ( 排 ...

  4. 深入浅出统计学 第六章 排列与组合

    内容简介 本章内容主要介绍了两个基本概念,排序与组合 其中组合是之后计算二项分布的预备知识 对于计算而言,重点在于理解其所适应的不同情况,并记忆公式. 两者区别(P261): 1. 排列与顺序有关 2 ...

  5. 算法之组合数学及其算法篇(一) ----- 排列与组合

    组合数学及其算法篇 前言 排列与组合 无重集的排列与组合 无重集的排列 应用例子 无重集的组合 应用例子 重集的排列和组合 重集的排列 重集的组合 前言 组合数学研究的对象是组态.所谓组态就是指若干个 ...

  6. python中如何求列表中的和_python实现求解列表中元素的排列和组合

    求解列表中元素的排列和组合问题这个问题之前就遇到过几次没有太留意,最近在做题的时候遇上挺多的排列组合问题的,想来有必要温习一下了,今天花点时间写一下,之前都是手工写的,后来知道可以直接使用python ...

  7. 回溯算法团灭子集、排列、组合问题

    回溯算法团灭子集.排列.组合问题 一.子集 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: nums = [1,2,3] ...

  8. 排列与组合的Java递归实现 (参考)

    我们在笔试面试过程中经常会遇到关于排列与组合的问题,其实这些可以通过递归简单的实现,看下面两个例子: (1)关于字符串排列的问题 输入一个字符串,打印出该字符串中字符的所有排列.例如输入字符串abc, ...

  9. 【离散数学中的数据结构与算法】六 排列与组合二

    接着上一篇学习:[离散数学中的数据结构与算法]五 排列与组合一 上一篇文章主要学习了可重复选取的可重排列和不可重复选取的排列.他们都是在n个不同的对象中选取. 今天我们俩学习的是,当这个n个对象中有相 ...

  10. 排列公式和组合公式_排列与组合:排列公式与组合公式之间有什么区别?

    排列公式和组合公式 Here's the short version. 这是简短的版本. Let's take ringing bells in a church as an example. 让我们 ...

最新文章

  1. 密码学研究-数字签名
  2. hbase建索引java api_hbase java api样例(版本1.3.1,新API)
  3. 阿里CTO张建锋:云拐点已至,All in cloud;贾扬清完整title公开
  4. vuex结合php,vuex中store的使用介绍(附实例)
  5. [Python学习]PycURL简单学习 - limodou的学习记录 - limodou是一个程序员,他关心的焦点是Python, DocBook, Open Source …...
  6. 网络编程中设计并发服务器,使用多进程 与 多线程 ,请问有什么区别?
  7. MySQL怎么选择合适的存储引擎
  8. ocelot和nginx比较_nginx + ocelot+.net core signalr 关于websocket无法正常握手的问题
  9. REVERSE-PRACTICE-BUUCTF-26
  10. 从远程(包括ftp,http等协议)地址获取文件流信息
  11. 视频通信原理——NAT介绍
  12. Spring按类型自动装配注入数组、集合、Map
  13. Hive 中的Mapper Reducer个数 决定因素
  14. oracle ogg checkpoint,OGG 11g Checkpoint 详解
  15. asp.net 学习交流群 130017551
  16. null=null不能作为关联条件
  17. baacloud无法连接到_加入 Beta 版“Baacloud33” - TestFlight - Apple
  18. mysql数据库程序设计实例_mysql数据库编程精华案例347个(知此347个例子,便是高手矣)...
  19. 计算机指法标准,计算机键盘指法的正确练习步骤
  20. 一文说透区块链为何必须扩容,扩容的未来在哪里?

热门文章

  1. [Linux]CentOS修改YUM镜像地址提高下载速度
  2. excel选择性粘贴为何是html,选择性粘贴,教您excel选择性粘贴怎么用
  3. 一只蒟蒻的树形DP学习笔记
  4. 计算机播放音乐无声音,电脑放歌就突然没声音该怎么办
  5. 从 Aave 到 Yearn:一文梳理 DeFi 中的「蓝筹股」
  6. linux aufs,UnionFS有什么用?AUFS的一些特性
  7. centos6.3安装bluefish
  8. python怎么算积分_Python求解数值积分-定积分求解
  9. textaligncenter仍然不居中_你不知道的中华文化,中华文化的根源不是儒家而是河图洛书...
  10. android的otg功能,Android实现OTG功能