生成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-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));
现场演示
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么不;名字在地图上是按顺序排列的吗
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 可组合的lambda/std::函数与std::可选
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 按对象的特定方法按升序排列的C++优先级队列
- 混合组合和继承的C++问题
- 我需要将多个函数组合为一个函数
- 构建可组合有向图(扫描仪生成器的汤普森构造算法)
- 通过组合不同的类型来创建唯一的id
- 在C++中寻找排列和组合
- 在 c 中给定一个固定数的情况下,找到所有可能的加法和组合(给定一个总和,找到它的可能的加法和排列
- 从给定字符串中查找长度 k 的所有排列/组合
- 从左到右打印字符串的组合(不是排列)c++
- 排列和组合生成算法
- C++ STL 下一个组合排列
- 查找所有可能的排列或具有相同顺序的组合
- 给定数字的排列和组合
- 生成0,1,…中所有可能的组合n-1, n (k)每个组合应按升序排列