如何找到具有最大总和和大小的最小不相交子集

时间:2018-12-20 17:43:09

标签: python algorithm set set-theory

我正在寻找一组(我们将表示b_i)中不相交的子集(我们将表示这些X)的最小数量,以使所有b_i都满足以下限制条件:

  • x_i中的每个元素X应该精确地放入一批。
  • 所有len(b_i) <= MAX_ELEMENTS_PER_BATCH
  • i
  • 所有sum(b_i) <= MAX_SUM_PER_BATCH
  • i

我想出了一种启发式方法来查找满足约束条件的批次,但不能保证批次的最小数量。

例如:

  1. 对集合进行排序。
  2. 采用最大的元素并将其插入批次中。
  3. 用最小的元素填充批次,直到添加下一个元素将使批次总和超过MAX_SUM_PER_BATCH
  4. 从集合中删除此批次中的元素
  5. 重复步骤2-4,直到没有剩余元素为止。

我意识到这可能是一个我不知道的名字解决的问题,并且针对最小批次进行优化会带来复杂性。

请在您的答案中输入伪代码,python或java。

1 个答案:

答案 0 :(得分:0)

那又怎么样:

  1. 排序集合(从大到小)

  2. 采用集合的下一个元素,并尝试根据2条规则将其放入现有批次中(从创建的第一个批次开始)。

  3. 如果适合,添加到批次并返回到2。否则,创建一个新批次,添加到它并返回到2

我相信它可以满足所有条件,并且排序后只需1次线性采集即可

编辑:存储批次的当前总和而不每次都重新计算可能会更有效