在 n 成员数组中产生 m 成员组合

Posted

技术标签:

【中文标题】在 n 成员数组中产生 m 成员组合【英文标题】:producing m-member combination in a n-member array [duplicate] 【发布时间】:2016-03-27 10:47:54 【问题描述】:

我有一个包含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可以查看吗?你是要我们解决你的作业吗?请把这个问题搁置! 【参考方案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 太短了)。 你是对的,错过了那部分:)

以上是关于在 n 成员数组中产生 m 成员组合的主要内容,如果未能解决你的问题,请参考以下文章

编译时:计算类型 X 的成员的 #(~N) 个并定义一个成员数组 [N]?

java语言中成员方法可以初始化成员变量吗?

c++之继承与派生

C语言 判断一个数是不是是数组中的成员 用C语言编程

C++ 多个版本的默认特殊成员函数 -- MSVC 2015 中的错误

HashMap之成员变量介绍