正如我们从编程中所知,有时候问题会有轻微变化 显着改变其解决方案的形式。
首先,我想创建一个简单的求解算法 以下问题并使用bigtheta对其进行分类 符号:
将一群人划分为两个不相交的子群 (任意大小)这样的 成员总年龄的差异 这两个小组尽可能大。
现在我需要改变问题以便达到预期目的 差异尽可能小并且分类 我解决问题的方法。
好吧,首先我需要创建初始算法。 为此,我应该进行某种排序以便将团队分开,我想如何继续?
编辑:对于第一个问题,我们排除了设置为空集的可能性。所以我们所要做的只是一个线性搜索,找到最小年龄,然后把它放在一个集合B.BoA现在有除了setB的年龄之外的所有其他年龄,这是最小年龄。所以这里是两组总年龄的最大差异,尽可能高
答案 0 :(得分:0)
你描述第一个问题的方式,它要求你只找到最小元素(如果子组应该包含至少1个成员)的方式是微不足道的,否则它已经解决了。
第二个问题可以递归地解决,伪代码将是:
// compute sum of all elem of array and store them in sum
min = sum;
globalVec = baseVec;
fun generate(baseVec, generatedVec, position, total)
if (abs(sum - 2*total) < min){ // check if the distribution is better
min = abs(sum - 2*total);
globalVec = generatedVec;
}
if (position >= baseVec.length()) return;
else{
// either consider elem at position in first group:
generate(baseVec,generatedVec.pushback(baseVec[position]), position + 1, total+baseVec[position]);
// or consider elem at position is second group:
generate(baseVec,generatedVec, position + 1, total);
}
现在只需使用generate(baseVec,"",0,0)
启动该功能,其中""
代表空矢量。
通过将算法应用于排序数组可以大大改善算法,因此添加了一个测试条件来停止分支,但这个想法保持不变。