c++ 组合算法(递归)
C++里自带的有全排列的函数用起来的非常的方便,不知道大家刷算法题的时候有没有遇到过这样的问题,当有些题目中需要用到组合的时候呢?如果是固定的几个数的组合,这样还好,可以通过几个循环就搞定了。那么当遇到不是固定的几个数呢?也就是的动态的呢?虽然该算法不难,但是如果在竞赛中遇到这样的问题也是要花费大量的时间的,不如现在就来学习下。
递归:
首先说明一下C(n,m)表示从n个元素中取出m个的组合。
(1)确定第一个位置可以取得的所有值存入辅助数组b。
(2)递归C(n-1,m-1),即由于前面已经确定一个数,因此本次递归相当于容量n-1,所取的数m-1。
(3)判结束,当递归m次即结束。
#include <iostream>
using namespace std;
//a为存放待组合的数值,b为用于暂存的数组
//n,m代表从n中取出m个数的组合
// M=m M用于输出
void c(int a[],int b[],int n, int m,const int M)
{
if (m>0)
{
for (int i =n;i>=m;i--)
{
b[m-1]=a[i-1];
//由于确定了当前位置的值
//则下次递归c(n-1,m-1)
c(a,b,i-1,m-1,M);
}
}
else
{
for(int i =0 ; i<M;i++)
cout<<b[i]<<" ";
cout<<endl;
}
}
int main ()
{
int arr[]={0,1,2,3,4,5,6};
int b[7];
c(arr,b,7,5,5);
return 0;
}