计算组合的算法

原创 2012年03月30日 14:13:38

长度为nNum的整数数组pGroups,计算从pGroups中选取nSelNum个元素的组合,放到pRes中

不同组合个数TotalNum由函数CalCombNum(a,b)计算,pRes长度为TotalNum*nSelNum

void CalCombination(int *pGroups, int nNum, int nSelNum,int *pRes)
{
	nSelNum=(nSelNum>nNum) ? nNum:nSelNum;
	int* pTemp = new int[nSelNum+1];

	for(int i=0; i<=nSelNum; i++)
		pTemp[i] = i-1;//这里pTemp[0]=-1用来作为循环判断标识

	int k = nSelNum;
	bool flag = true;// 标志找到一个有效组合
	while(pTemp[0] == -1)
	{
		if(flag)//输出符合要求的组合
		{
			for(int i=1; i<=nSelNum; i++)
			{
				*pRes=pGroups[pTemp[i]];
				pRes++;
			}

			flag = false;
		}

		pTemp[k]++;//在当前位置选择新的数字
		if(pTemp[k] == nNum)// 当前位置已无数字可选,回溯
		{
			pTemp[k--] = 0;
			continue;
		}

		if(k < nSelNum)// 更新当前位置的下一位置的数字
		{
			pTemp[++k] = pTemp[k-1];
			continue;
		}

		if(k == nSelNum)
			flag = true;
	}

	delete[] pTemp;
}
计算阶乘
int CalFactorial(int nNum)
{
	if(nNum<=0) return 1;

	int nRes=1;
	for(int i=1;i<=nNum;i++)
		nRes*=i;

	return nRes;
}
计算从a个元素中选取b个元素的组合种类:
int CalCombNum(int a, int b)
{
	return CalFactorial(a)/(CalFactorial(b)*CalFactorial(a-b));
}


相关文章推荐

编程算法 - 计算一个数的所有组合数 代码(C++)

计算一个数的所有组合数 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 计算一个数的组合数, 使用递归进行求解....

STL中计算排列组合关系的算法

算法思想:首先,从最尾端开始往前寻找两个相邻的元素,令第一个元素为*i,第二个元素为*ii,且满足 *i < *ii 。找到这样一组相邻元素后,再从最尾端开始往前检验,找出第一个大于*i的元素,令为*...

概论-组合最优化问题、计算复杂性和启发式算法概念(现代优化计算方法)

1.组合最优化问题 定义: 是通过数学方法的研究去寻找离散事件的最优编排、分组、次序或筛选等。 描述: 最优化问题的数学模型的一般描述是 , x为决策变量,f ( x )为决...

【算法复习四】计算复杂性与算法分析---组合数学知识汇总

一,组合数学问题         1)排列定义               • 从n个不同的元素中,取r个不重复的元素,按次序排列,称为从n个中取r个的无重排列。             ...

15个梨分给5个人的组合算法

  • 2016年03月16日 18:31
  • 3KB
  • 下载

组合算法JSP程序

  • 2013年07月10日 08:18
  • 34KB
  • 下载

C# 计算排列组合数,及列出所有组合形式的算法

前段时间有同学问到,如何编程求排列组合数,以及列出所有排列组合形式的算法。乘着放假,写了一种实现的方法!怕时间长了,淹没在硬盘里,记录在此! /// /// 计算Int...

算法组合博弈

  • 2014年10月04日 16:07
  • 1.45MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:计算组合的算法
举报原因:
原因补充:

(最多只允许输入30个字)