今天帮贴吧吧友解决一个组合的问题,本来是求固定个数的n个数其中m个数的所有组合,后来说要改成非固定的,想了很久没想出来怎么做,哈哈,能力有限,还有很大的提升空间。
然后就上网搜了一下相关的代码,果然有前辈的代码可以参考,找了一篇比较容易看懂的,看懂之后觉得原来的代码写的有点繁琐,就稍作了修改,总体思路没有改变,还是采用逐层递归的方法,只是简化了下代码,改了下风格。
代码如下:
#include <iostream>
#include <vector>
using namespace std;
template <typename T>
void CombineInner(const T& data, vector<T>& result, T& temp, const int n, const int m, int start, int depth)
{
for (int i = start; i < n - (m - depth - 1); ++i)
{
temp[depth] = data[i]; //每层输出一个元素
if (depth == m - 1)
result.push_back(temp); //只选m个数组合,个数达到后存入
else
CombineInner(data, result, temp, n, m, i + 1, depth + 1); //递归深入
}
}
template <typename T>
vector<T> Combine(const T &data, const int m)
{
int n = static_cast<int>(data.size());
if (m <= 0 || m > n)
return{};
int start = 0, depth = 0;
vector<T> result;
T temp(m, 0);
CombineInner(data, result, temp, n, m, start, depth);
return result;
}
int main()
{
int m = 4;
vector<int> A;
for (int i = 1; i < 7; i++)
A.push_back(i);
vector<vector<int> > C;
C = Combine(A, m);
cout << "一共有" << C.size() << "种M的组合方式。" << endl;
for (vector<vector<int> >::iterator itC = C.begin(); itC != C.end(); itC++)
{
for (vector<int>::iterator itCC = (*itC).begin(); itCC != (*itC).end(); itCC++)
{
cout << *itCC << " ";
}
cout << endl;
}
system("pause");
return 0;
}
输出如下:
一共有15种M的组合方式。
1 2 3 4
1 2 3 5
1 2 3 6
1 2 4 5
1 2 4 6
1 2 5 6
1 3 4 5
1 3 4 6
1 3 5 6
1 4 5 6
2 3 4 5
2 3 4 6
2 3 5 6
2 4 5 6
3 4 5 6
请按任意键继续. . .
参考文章:
C++ STL求全排列和组合