生成0,1,…中所有可能的组合n-1, n (k)每个组合应按升序排列

Generate all possible combinations in 0, 1,...n-1, n of k numbers. Each combination should be in ascending order

本文关键字:组合 排列 升序 n-1 生成 有可能      更新时间:2023-10-16

请理解这不是一个重复问题。这个问题需要排序组合。请先阅读问题。这个组合可以有重复的数字。目前,我已经尝试生成n-k+1个0和k个1的排列。但是它不会产生重复的组合。例如:从0 1 ....中选择3个数字N,它生成9个组合:

(0 1 2),
(0 1 3),
(0 1 4),
(0 2 3),
(0 3 4),
(1 2 3),
(1 2 4),
(1 3 4),
(2 3 4)

我需要它也包括这些组合:

(0, 0, 0),
(0, 0, 1),
(0, 0, 2),
(0, 0, 3),
(0, 0, 4),
(0, 1, 1),
(0, 2, 2),
(0, 3, 3),
(0, 4, 4),
(1, 1, 1),
(1, 1, 2),
(1, 1, 3),
(1, 1, 4),
(1, 2, 2),
(1, 3, 3),
(1, 4, 4),
(2, 2, 2),
(2, 2, 3),
(2, 2, 4),
(2, 3, 3),
(2, 4, 4),
(3, 3, 3),
(3, 3, 4),
(3, 4, 4),
(4, 4, 4)

得到这个结果最有效的方法是什么?我现在用next_permutation来生成这个组合。请看一看:

    vector<ll> nums, tmp;
    for(i = 0; i <= m - n; i++)
    {
        nums.push_back(0);
    }
    for(i = 0; i < n; i++)
    {
        nums.push_back(1);
    }
    do 
    {
        tmp.clear();
        for(i = 0; i <= m; i++)
        {
            if(nums[i] == 1)
            {
                tmp.push_back(i);
            }
        }
        for(i = 0; i < tmp.size(); i++)
        {
            cout << tmp[i] << " ";
        }
        cout << endl;
    } while(next_permutation(nums.begin(), nums.end()));

你的"组合"本质上是基于n进制的k位数字。有N^k个这样的数

生成它们最简单的方法是递归。

您还可以在0..N^k-1范围内组织简单的for-cycle,并表示上述系统中的循环计数器。伪代码

for (i=0; i<N^k; i++)  {  //N^k is Power, not xor
   t = i 
   d = 0
   digit = {0}
   while t > 0 do {
      digit[d++] = t%N //modulus
      t = t / N    //integer division
   }
   output digit array
}

以下内容可能有所帮助:

bool increment(std::vector<int>& v, int maxSize)
{
    for (auto it = v.rbegin(); it != v.rend(); ++it) {
        ++*it;
        if (*it != maxSize) {
            return true;
        }
        *it = 0;
    }
    return false;
}

用法:

std::vector<int> v(3);
do {
    // Do stuff with v
} while (increment(v, 10));

现场演示