组合算法

从n个不同元素中,任取m(m≤n)个元素并成一组,叫做从n个不同元素中取出m个元素的一个组合;从n个不同元素中取出m(m≤n)个元素的所有组合的个数,叫做从n个不同元素中取出m个元素的组合数。

这里实现的是所有的从1-n个元素的组合。

代码如下:

#include <iostream>
#include <cstdlib>

void PrintData(int* pData, int begin, int end)
{
	for (int idx = begin; idx <= end; ++idx)
	{
		std::cout << pData[idx] << " ";
	}

	std::cout << std::endl;
}

// pTempData是中下一个待赋值下边
// begin是pData中剩余可选位置开始下标
// end是pData中剩余可选位置结束下标(包括)
// chooseCount为剩余需要选择的数量
void Conbination(int* pData, int* pTempData, int curIdx, int begin, int end, int chooseCount)
{
	if (nullptr == pData || nullptr == pTempData) return;
	
	if (0 == chooseCount) // 目标已达成,不需要再选
	{
		PrintData(pTempData, 0, curIdx - 1);
		return;
	}

	if (begin > end) // 已经没有可选数据, 回溯
		return;

	for (int idx = begin; idx <= end; ++idx)
	{
		pTempData[curIdx] = pData[idx];
		Conbination(pData, pTempData, curIdx + 1, idx + 1, end, chooseCount - 1);
	}
}

void Conbination(int* pData, int size, int chooseCount)
{
	if (nullptr == pData || size < 0 || chooseCount < 0 || chooseCount > size) return;

	// 临时数组,用来存在选出的数据
	int* pTempData = new int[size]; 
	memset(pTempData, 0, sizeof(int) * size);
	Conbination(pData, pTempData, 0, 0, size - 1, chooseCount);

	delete[] pTempData;
}

int main()
{
	int datas[5] = { 1, 2, 3, 4, 5};
	// 依次从datas中选择1、2、3、4、5个数组的组合
	for (int idx = 1; idx <= 5; ++idx) Conbination(datas, 5, idx);
	return 0;
}

输出如下

1
2
3
4
5
1 2
1 3
1 4
1 5
2 3
2 4
2 5
3 4
3 5
4 5
1 2 3
1 2 4
1 2 5
1 3 4
1 3 5
1 4 5
2 3 4
2 3 5
2 4 5
3 4 5
1 2 3 4
1 2 3 5
1 2 4 5
1 3 4 5
2 3 4 5
1 2 3 4 5
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值