繁体   English   中英

遍历所有可能的组合

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM