【发布时间】:2020-08-21 17:15:32
【问题描述】:
我有一个包含 N 个元素的数组(N 是偶数):[2, 4, 8, ..., 2^N]。我需要将其拆分为 2 数组,每个数组都有 N/2 元素,并获得此数组之和之间差异的最小绝对值。
对于2, 4, 8, 16,答案是(2+16)-(4+8)=6。谁能向我解释解决这个问题的数学方面(没有蛮力)?如果原始数组是range[1, N],解决方案会一样吗?
【问题讨论】:
我有一个包含 N 个元素的数组(N 是偶数):[2, 4, 8, ..., 2^N]。我需要将其拆分为 2 数组,每个数组都有 N/2 元素,并获得此数组之和之间差异的最小绝对值。
对于2, 4, 8, 16,答案是(2+16)-(4+8)=6。谁能向我解释解决这个问题的数学方面(没有蛮力)?如果原始数组是range[1, N],解决方案会一样吗?
【问题讨论】:
自从2^N > sum(2..2^(N-1) 以来,它看起来相当微不足道。因此,为了最小化差异,您希望将2^(N/2)+..._2^(N-1) 放在与2^N 不同的集合中。
【讨论】:
如果原数组是range[1, N],解会不会一样?
对于数组1, 2, ... N,答案是0 或1,具体取决于N mod 4。
如果N = 4k,则最小差异为0,并由分区获得(例如):
1 3 5 ... (2k - 1) (2k + 2) (2k + 4) ... 4k
2 4 6 ... 2k (2k + 1) (2k + 3) (2k + 5) ... (4k - 1)
如果N = 4k + 2 则最小差异为1 并由分区获得(例如):
1 3 5 ... (2k + 1) (2k + 4) (2k + 6) ... (4k + 2)
2 4 6 ... (2k + 2) (2k + 3) (2k + 5) ... (4k + 1)
任意数组的一般情况称为partition problemwith constraint of equal size,证明是weakly NP-complete。
【讨论】: