组合算法-递归实现

假设在n个数中选取m(0<m<=n)个数为例,可以假这个问题划分为下面两个问题:

  1. 从n个数中选取编号最大的数,然后在剩下的n-1个数里面选取m-1个数,直到从n-(m-1)个数中选取1个数。
  2. 从n个数中选取编号更小的一个数,继续执行第一步,直到当前可选编号最大的值为m。

下面是递归方法的实现:
/// 求从数组a[1..n]中任选m个元素的所有组合。
/// a[1..n]表示候选集,m表示一个组合的元素个数。
/// b[1..M]用来存储当前组合中的元素, 常量M表示一个组合中元素的个数。
void combine( int a[], int n, int m,  int b[],int M )
{
	int i = 0;
	for(i=n; i>=m; i--){
		b[m-1] = i - 1;
		if (m > 1){
			combine(a,i-1,m-1,b,M);
		}else{
			int j=0;
			for(j=M-1; j>=0; j--)
				printf("%d,",a[j]);
			printf("\n");
		}
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值