自定义分区问题

时间:2011-04-07 18:21:32

标签: c algorithm greedy data-partitioning

我有以下问题:给定一组N个整数将它们分成两个几乎相等的分区,使得较大分区的总和最小。这听起来几乎像经典分区问题,但有一个例外:偶数可以除以2,每半可以放在一个单独的分区中。

例如: N = 4 数字:20 5 3 1

结果是:15

说明: 第一个数字将除以2,每半个数字放在两个分区中的一个=>第一个分区= 10,第二个分区= 10.第二个分区将被添加到第一个分区=>第一个分区= 15.最后两个数字将被添加到第二个分区=>第二个分区= 14

=>较大分区的总和(分区一)= 15。

我的想法是逐渐减少奇数并使用贪婪算法开始添加它们,始终保持两个分区之和尽可能最佳。在完成奇数后,剩下的就是取偶数,然后看看是否将它们完全添加到一个分区比将它们除以2并将每一半加到这两个分区中的一个更为理想。

对于以下数据集,算法将提供正确的答案: N = 2 数字:16 15

=>将需要15,将其添加到第一个分区,然后取16看不是最佳的将它除以2,因此它会将它添加到第二个分区。

=>答案是16岁。

如果您能为我提供一组算法无法提供最佳答案的数据,我感兴趣。如果您能提出任何改进建议,我将不胜感激。

谢谢! :)

3 个答案:

答案 0 :(得分:3)

我会在一次传递中拆分所有偶数,然后应用经典分区算法。或者是否有一些次要目标来减少分裂的数量?

答案 1 :(得分:1)

partition problem是NP完全的,这意味着不可能存在多项式时间算法。您修改的变体也是NP完全的;缩小到原始版本非常简单。

答案 2 :(得分:0)

为什么不将每个数字分成两半并将额外的1作为奇数用于循环分区?第二个分区总是具有较小的总和。

List: 20 17 6 5 3 0 -1 9999999

P1: 10 | 8+1 | 3 | 2 | 1+1 | 0 | -1 | 4999999+1 | ==> sum is 5000025 P2: 10 | 8 | 3 | 2+1 | 1 | 0 | -1+1 | 4999999 | ==> sum is 5000024