两种解法(找出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
推荐阅读
- 10.两种记账方式
- 围城名句
- 关于两种潜能生的性格分析
- 推荐两种减压方式
- for循环遍历数组
- 人生的两种
- 人生由你来配
- linux|linux 终端io笔记
- 运营懒人包|找出你专属的运营定位
- 十种顶级思维