如果有人可以指出这个问题的正确方向,我将不胜感激。我试图找到各种不同的组合,每个组合都有不同的列数(在C++中)。例如考虑数字2:
两栏:
2 = {2,0}
{0,2}
{1,1}
三栏:
2 = {0,0,2}
{0,2,0}
{2,0,0}
{1,1,0}
{0,1,1}
{1,0,1}
四栏:
2 = {0,0,0,2}
{0,0,2,0}
{0,2,0,0}
{2,0,0,0}
{1,1,0,0}
{0,0,1,1}
{0,1,1,0}
{1,0,0,1}
{1,0,1,0}
{0,1,0,1}
提前致谢!
最佳答案
这是我的尝试:
void combinations(int n, int columns, std::vector<int>& soFar)
{
if (columns == 1)
{
for (auto e : soFar)
std::cout << e << " ";
std::cout << n << '\n';
return;
}
for (int i = 0; i <= n; ++i)
{
soFar.push_back(i);
combinations(n - i, columns - 1, soFar);
soFar.pop_back();
}
}
void combinations(int n, int columns)
{
std::vector<int> soFar;
combinations(n, columns, soFar);
}
基本上,您会一直将数字分为两个子部分,直到达到深度限制(案例中的列数)为止。
为了继续在备份过程中打印以前的数字,我将它们存储在
soFar
vector 中,并相应地推送和弹出它们。这是
combinations(2, 4)
的输出:0 0 0 2
0 0 1 1
0 0 2 0
0 1 0 1
0 1 1 0
0 2 0 0
1 0 0 1
1 0 1 0
1 1 0 0
2 0 0 0