我有这个家庭作业,我认为我设法解决了,但我不能完全确定,因为我无法证明我的解决方案。我想评论我做了什么,它的正确性以及是否有更好的解决方案。
问题如下:我们有N
个人群组,其中i
个群组中有g[i]
人。我们希望将这些人分别放在两排S
个座位上,这样:每个组只能以连续的顺序放在一行上,或者如果该组具有偶数个成员,我们可以将它们分成两行并将它们放在两行上,但条件是它们必须形成一个矩形(因此它们必须在两行上具有相同的索引)。所需的最小座位数S
是多少,以便没有人站起来?
示例:组为4 11
。最低S
为11
。我们将所有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
,这就是答案。
这似乎有效,至少我找不到任何反例。我没有证据。直观地说,似乎总是可以根据所需条件安排人员使用此算法提供的座位数。
任何提示都表示赞赏。
答案 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
。