将一组人划分为两个不相交的子组(任意大小)并找到一些值

时间:2013-12-17 00:46:51

标签: algorithm sorting max

正如我们从编程中所知,有时候问题会有轻微变化 显着改变其解决方案的形式。

首先,我想创建一个简单的求解算法 以下问题并使用bigtheta对其进行分类 符号:

将一群人划分为两个不相交的子群 (任意大小)这样的 成员总年龄的差异 这两个小组尽可能大。

现在我需要改变问题以便达到预期目的 差异尽可能小并且分类 我解决问题的方法。

好吧,首先我需要创建初始算法。 为此,我应该进行某种排序以便将团队分开,我想如何继续?

编辑:对于第一个问题,我们排除了设置为空集的可能性。所以我们所要做的只是一个线性搜索,找到最小年龄,然后把它放在一个集合B.BoA现在有除了setB的年龄之外的所有其他年龄,这是最小年龄。所以这里是两组总年龄的最大差异,尽可能高

1 个答案:

答案 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)启动该功能,其中""代表空矢量。

通过将算法应用于排序数组可以大大改善算法,因此添加了一个测试条件来停止分支,但这个想法保持不变。