您的位置:首页 > 其它

两种解法:找出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比较小的时候可以考虑一下。

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: