例如,当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 (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