组合算法

组合算法1

http://blog.sina.com.cn/s/blog_49b05ad00100dkbi.html


#include "stdafx.h"
#include "stdio.h"
/*
void combine(int a[], int n, int m, int b[], int M);

参数:
a 存放候选数字
n 总项数
m 取出项数  用于递归  递归不是原始值(变化量)
b 存放选出结果
M  = m   M 取出项数 用于输出数据  递归还是原始值
*/

#define MAX 5
void combine(int a[], int n, int m, int b[], int M);

int main(void)
{
	int i;
	int a[MAX], b[MAX];

	for (i = 1; i <=MAX; i++)
		a[i - 1] = i;

	combine(a, MAX, 3, b, 3);

}

void combine(int a[], int n, int m, int b[], int M)
{ 
	int i, j;

	for (i = n; i >= m; i--)
	{
		b[m - 1] = i - 1;
		if (m > 1)
		{
			combine(a, i - 1, m - 1, b, M);
		}
		else
		{
			for (j = M - 1; j >= 0; j--)
			{
				printf("%d ", a[b[j]]);			
			}
			printf("\n");
		}
	}
}


组合算法2

//3.n取r的组合
#include "stdafx.h"
#include "stdio.h"
const int N = 16;

//int r = 4;
//char used[N];
int count;
void combine(int a[],int b[],int pos,int r)
{
	int i;
	if(pos==r)
	{
		for(i = 0;i<r;i++)
		{
			printf("%d ",a[b[i]]);
		}
		printf("\n");
		count++;
		return;
	}
	//这里是关键,第i个位置上的数,只能是从排在第i位的数开始的N-r个中的一个,后面的数一定要比前面的大
	for(i = (pos>0?(b[pos-1]+1):pos);i<=pos+N-r;i++)  
	{
		/*if(!used[i])*/
		{
			b[pos] = i;
			//used[i]++;
			combine(a,b,pos+1,r);
			//used[i]--;
		}
	}
}
int main()
{
	int a[N];
	int b[N];
	for (int i = 0; i<N; i++)
	{
		a[i] =i;
	}
	combine(a,b,0,4);

	printf("%d\n",count);
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值