从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