最佳地安排一群人

时间:2011-04-07 23:12:43

标签: algorithm

我有这个家庭作业,我认为我设法解决了,但我不能完全确定,因为我无法证明我的解决方案。我想评论我做了什么,它的正确性以及是否有更好的解决方案。

问题如下:我们有N个人群组,其中i个群组中有g[i]人。我们希望将这些人分别放在两排S个座位上,这样:每个组只能以连续的顺序放在一行上,或者如果该组具有偶数个成员,我们可以将它们分成两行并将它们放在两行上,但条件是它们必须形成一个矩形(因此它们必须在两行上具有相同的索引)。所需的最小座位数S是多少,以便没有人站起来?

示例:组为4 11。最低S11。我们将所有4放在一行,将11放在第二行。另一个:组是6 2。我们将6分成两行,也就是两行。因此,最低为4个席位。

这就是我的想法:

计算T = (sum of all groups + 1) / 2。将组号存储在一个数组中,但将所有偶数值x分成两个x / 2值。因此4 5变为2 2 5。现在在此向量上运行subset sum,找到可以形成的高于或等于T的最小值。该值是每行所需的最小座位数。

示例:4 11 => 2 2 11 => T = (15 + 1) / 2 = 8。至少我们可以从2 2 11形成>= 8 11,这就是答案。

这似乎有效,至少我找不到任何反例。我没有证据。直观地说,似乎总是可以根据所需条件安排人员使用此算法提供的座位数。

任何提示都表示赞赏。

2 个答案:

答案 0 :(得分:3)

我认为您的解决方案是正确的。最佳分布中每行的最小座位数将是您的T(这在数学上是显而易见的)。

分割偶数也是正确的,因为它们有两种可能的安排;通过逻辑地将所有“矩形”人群放在座位行的一端,您还可以保证它们将始终形成一个合适的矩形,以便满足这一条件。

所以问题归结为找到与T相等或尽可能接近的总和(例如partition problem)。

答案 1 :(得分:0)

Minor nit:我不确定上面提出的解决方案是否适用于每个组都有0个成员的边缘情况,因为T = SUM ALL + 1 / 2中的分子总是正数,所以永远不会有子集和大于或等于T

为了解决这个问题,也许模数运算可能在这里起作用。我们知道如果n是最大奇数项,我们需要至少 n个席位,所以这个等式可能在其中有max(n * (n % 2))个术语。它将出现在max(odd)或0.由于最大奇数项总是被添加到S,我认为这是安全的(粗略地说明没有证据......)。

然后我们想知道我们是否应该分开偶数条款。这是子集求和方法可能起作用的地方,但T只等于SUM ALL / 2