两种解法:找出n个自然数(1,2,3,……,n)中取r个数的组合。
2016-04-01 09:17
288 查看
例如,当n=5,r=3时,所有组合为:
1 2 3
1 2 4
1 2 5
1 3 4
1 3 5
1 4 5
2 3 4
2 3 5
2 4 5
3 4 5
解法1:这种算法的时间复杂度为O(n^r),且r的大小已知,这样才能确定循环的层数。这种算法对于r比较小的时候可以考虑一下。
算法二:递归
输出结果为:
5 4 3
5 4 2
5 4 1
5 3 2
5 3 1
5 2 1
4 3 2
4 3 1
4 2 1
3 2 1
1 2 3
1 2 4
1 2 5
1 3 4
1 3 5
1 4 5
2 3 4
2 3 5
2 4 5
3 4 5
解法1:这种算法的时间复杂度为O(n^r),且r的大小已知,这样才能确定循环的层数。这种算法对于r比较小的时候可以考虑一下。
int main() { int n = 5; int r = 3; for (int i = 1;i<=n-r+1;++i) { for (int j=i+1;j<=n-r+2;++j) { for (int k=j+1;k<=n-r+3;++k) { cout<<i<<'\t'<<j<<'\t'<<k<<endl; } } } return 0; }
算法二:递归
#include <iostream> #include <vector> using namespace std; //在n个元素中找出r个元素的排列,结果保存在res中,tmp为某个排列的临时变量 void comb(int n, int r,vector<vector<int>> &res, vector<int> &tmp) { //如果i比r小的话,则在1到i的范围内找不到r个数 for (int i=n;i>=r;--i) { tmp.push_back(i); if (r>1) { comb(i-1,r-1,res,tmp); } //r =1,这时将结果保存下来 else { res.push_back(tmp); } //回溯 tmp.resize(tmp.size()-1); } } int main() { vector<vector<int>> res; vector<int> tmp; comb(5,3,res,tmp); for (vector<vector<int>>::iterator it= res.begin();it!= res.end();++it) { for (vector<int>::iterator itb=it->begin();itb!=it->end();++itb) { cout<<*itb<<" "; } cout<<endl; } return 0; }
输出结果为:
5 4 3
5 4 2
5 4 1
5 3 2
5 3 1
5 2 1
4 3 2
4 3 1
4 2 1
3 2 1
相关文章推荐
- Hello China操作系统在Virtual PC上的安装和使用
- 双飞翼布局
- PHP SOAP 客户端POST XML详细代码
- [BZOJ2453]维护队列(分块)
- java反射知识点总结
- CentOS 7 修改 yum 的源
- Linux中时间、循环、变量、判断
- jquery validate验证使用说明
- spark on yarn模式下扫描带有kerberos的hbase
- 8. String to Integer (atoi)
- PHP数组编码转换
- Codeforces Round #346 (Div. 2) (659A,659B,659C,659D(几何叉乘),659E(并查集))
- Python函数的各种参数(含星号参数)
- pageContext对象的用法
- 使 Spine 忽略 TimeScale 的影响
- Android中的Thread与AsyncTask的区别?
- JSON练习
- NOIP 2015 d2t1【poj 3258】 River Hopscotch 二分
- linux上安装Resin
- C++(union), C#(伪union)实现 Java的Float.intBitsToFloat()方法