两种解法(找出n个自然数(1,2,3,……,n)中取r个数的组合。)

例如,当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比较小的时候可以考虑一下。

int main() { int n = 5; int r = 3; for (inti = 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<

算法二:递归
#include #include using namespace std; //在n个元素中找出r个元素的排列,结果保存在res中,tmp为某个排列的临时变量 void comb(int n, int r,vector> &res, vector &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> res; vector tmp; comb(5,3,res,tmp); for (vector>::iterator it= res.begin(); it!= res.end(); ++it) { for (vector::iterator itb=it->begin(); itb!=it->end(); ++itb) { cout<<*itb<<" "; } cout<

【两种解法(找出n个自然数(1,2,3,……,n)中取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

    推荐阅读