[英]Iterating through all possible combinations
我的目标是遍历给定数量的1和0的所有组合。 假设,如果我得到的数字是5,那将是一种足够快的列出方法
1110100100、1011000101等(5 1和5 0的每个不同组合)
我试图避免迭代所有可能的排列,并检查是否存在5 1,因为2 ^ n大于(n选择n / 2)。 谢谢。
UPDATE
可以使用以下方法有效地计算答案(递归10深度):
// call combo() to have calculate(b) called with every valid bitset combo exactly once
combo(int index = 0, int numones = 0) {
static bitset<10> b;
if( index == 10 ) {
calculate(b); // can't have too many zeroes or ones, it so must be 5 zero and 5 one
} else {
if( 10 - numones < 5 ) { // ignore paths with too many zeroes
b[index] = 0;
combo(b, index+1, numones);
}
if( numones < 5 ) { // ignore paths with too many ones
b[index] = 1;
combo(b, index+1, numones++);
}
}
}
(以上代码未经测试)
您可以解决问题。 如果您固定1
s(反之亦然),则只不过是您将0
s放在哪里的问题。 对于5 1
s,有5 + 1个bin,您要在bin中放入5个元素( 0
s)。
这可以通过每个bin的递归和每个bin的循环来解决(将0 ... REAM元素放入bin中-最后一个bin除外,您必须在其中放置所有剩余的元素)。
考虑它的另一种方法是作为字符串置换问题的变体-只需构建长度为2n的向量(例如111000),然后对字符串置换使用相同的算法即可构建结果。
请注意,幼稚算法将打印重复结果。 但是,通过将bool数组保留在递归函数中(可以保留为特定位设置的值),该算法可以轻松地忽略这些重复项。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.