如果有人可以指出这个问题的正确方向,我将不胜感激。我试图找到各种不同的组合,每个组合都有不同的列数(在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

10-06 09:15