排列和组合
来源:互联网 发布:iconkit windows 编辑:程序博客网 时间:2024/06/09 02:33
每一位都有两种状态,当选和不当选,从而分成两个子问题,递归解决。
#include <iostream>using namespace std;template <class Type>void combine(Type a[], bool b[], int start, int end){ if(start > end) { for(int i = 0; i <= end; ++i) { if(b[i]) cout<<a[i]<<" "; } cout<<endl; } else { b[start] = true; combine(a,b,start+1,end); b[start] = false; combine(a,b,start+1,end); }}int main(){ int p[3]={1,2,3}; int N = 3; cout<<"combine:"<<endl; bool b[3]; combine(p,b,0,N-1); return 0;}
全排列
全排列是将一组数按一定顺序进行排列,如果这组数有n个,那么全排列数为n!个。现以{1, 2, 3, 4, 5}为
例说明如何编写全排列的递归算法。
1、首先看最后两个数4, 5。 它们的全排列为4 5和5 4, 即以4开头的5的全排列和以5开头的4的全排列。
由于一个数的全排列就是其本身,从而得到以上结果。
2、再看后三个数3, 4, 5。它们的全排列为3 4 5、3 5 4、 4 3 5、 4 5 3、 5 3 4、 5 4 3 六组数。
即以3开头的和4,5的全排列的组合、以4开头的和3,5的全排列的组合和以5开头的和3,4的全排列的组合.
从而可以推断,设一组数p = {r1, r2, r3, ... ,rn}, 全排列为perm(p),pn = p - {rn}。
因此perm(p) = r1perm(p1), r2perm(p2), r3perm(p3), ... , rnperm(pn)。当n = 1时perm(p} = r1。
为了更容易理解,将整组数中的所有的数分别与第一个数交换,这样就总是在处理后n-1个数的全排列。
#include <iostream>using namespace std;template <class Type>void permute(Type a[], int start, int end){ if(start == end) { for(int i = 0; i <= end; ++i) { cout<<a[i]<<" "; } cout<<endl; } else { for(int i = start; i <= end; ++i) { swap(a[i],a[start]); permute(a,start+1,end); swap(a[i],a[start]); } }}int main(){ int p[3]={1,2,3}; int N = 3; cout<<"permute:"<<endl; permute(p,0,N-1); return 0;}
- 排列、组合和全排列
- 组合和排列
- 生成排列和组合
- 排列和组合问题
- 全排列和组合
- 排列和组合
- 生成组合和排列
- 求全排列和组合
- 排列和组合
- 排列和组合
- 组合和全排列
- 排列和组合算法
- 排列和组合区别
- 排列和组合
- lua实现全排列和组合排列
- 字符串的排列和组合
- 递归枚举排列和组合
- dfs 生成排列和组合
- 让IE9以下的版本兼容HTML5解决方案
- 转载_vmware中的bridge、nat区别
- 第五周C++上机报告(对象数组处理成绩)
- 谈谈Memcached与Redis
- PostgreSQL 数据库安装过程中的 readline的手动安装和正确配置
- 排列和组合
- ZendStudio快捷键
- version control
- 矩阵变换与图片平移,旋转,缩放的原理
- mapred.map.tasks 如何影响map的个数
- css3.0 边框圆角
- HTML5学习之FileReader接口
- 大型高并发高负载web应用系统架构-数据库架构策略
- 代码坏味