【问题标题】:producing m-member combination in a n-member array [duplicate]在 n 成员数组中产生 m 成员组合
【发布时间】:2023-12-05 17:44:01
【问题描述】:

我有一个包含n 成员的数组。我还有另一个号码:m,(m <= n),由用户输入。现在我想在数组中生成所有可能的“m”成员组合。

A[5] = {a,b,c,d,e};
B = 3
Number of combination: C(5, 3) = 10

现在我想要一个代码来显示这 10 个组合。like:

{{a,b,c},{a,b,d},{a,b,e},.....}

排列中的项目顺序很重要。例如{a,b,d} 是正确的,但{b,d,a} 是错误的。排列项应该在我们的矩阵中按顺序排列。

我会从你这边得到任何帮助。提前致谢

【问题讨论】:

  • 你想要的不是排列,而是组合(即使我给出的解决方案是 mask 的排列)。
  • 是的,因为成员的顺序很重要,所以它是组合而不是 permutation.tnx
  • @shirin 不直接来自您的声明。对于组合,顺序通常无关紧要。你想要的是一个有序组合(它是一组排列的子集)
  • @JoelCornett 我想你可能误解了这个问题。 OP 以{b,d,a} 为例说明 输出的内容,因为他们想要规范化的形式{a,b,d}。我的解释是,他们想要的正是集合 A 的 m 组合
  • 你做了什么?有代码sn-p可以查看吗?你是要我们解决你的作业吗?请把这个问题搁置!

标签: c++ arrays algorithm combinations


【解决方案1】:

组合:

template <typename T>
void Combination(const std::vector<T>& v, std::size_t count)
{
    assert(count <= v.size());
    std::vector<bool> bitset(v.size() - count, 0);
    bitset.resize(v.size(), 1);

    do {
        for (std::size_t i = 0; i != v.size(); ++i) {
            if (bitset[i]) {
                std::cout << v[i] << " ";
            }
        }
        std::cout << std::endl;
    } while (std::next_permutation(bitset.begin(), bitset.end()));
}

Live demo

【讨论】:

  • @NiklasB.: 对于超集是可能的。在您的建议中,我们必须计算设置了多少位:/。 (我还可以补充一点,如果 OP 想要每对 129 个元素的向量,你的 int 太短了)。
  • 你是对的,错过了那部分:)