在 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]?