我有一个数字列表,例如。
出于我的计划的目的,这些数字必须分为两组。根据集合中的数字,程序计算每组的效率。然后它结合了两组组合的效率商。然后将这两组及其效率商保存在一个数组中。
目标是找到两个集合效率最高的集合组合。
我的问题:目前,我似乎无法绕过检查每个可能的组合组合所需的算法。就我所知,它似乎需要一种递归形式。
如果您需要更多信息,请告诉我们!提前谢谢!
答案 0 :(得分:0)
要迭代可以形成两个集合的所有可能方式,您应该迭代初始列表的所有可能子集。为此,您可以使用大小为n的位掩码,其中n是初始列表中的元素数。
要生成大小为n的所有可能的位掩码,您可以使用一个简单的循环(应该很容易移植到其他语言的c ++代码):
for (int mask = 0; mask < (1 << (n - 1)); ++mask) {
for (int i = 0; i < n; ++i) {
if (mask & (1 << i)) {
// element i is in the first sub set
} else {
// element i is in the second sub set
}
}
// compute efficiency quotient for these subsets
}
总体复杂性是2 n * efficiency_quotient计算,除非你有关于效率商的其他信息,否则你可以做到最好。
注意:这里我循环到1 << (n - 1)
以避免考虑子集A和B,然后考虑B和A.如果效率商关注订单,则需要将其更改为1 << n
。