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;
}
posted @ 2022-12-08 10:57  MasonLee  阅读(348)  评论(0编辑  收藏  举报