如何将数组分成2个部分,使这两个部分具有相等的平均值?每个分区可能包含数组中不连续的元素。 我能想到的唯一算法是指数可以做得更好吗?
答案 0 :(得分:15)
您可以将此问题减少到sum-subset problem - 也cached here。这是想法。
让A
成为数组。计算S = A[0] + ... + A[N-1]
,其中N
是A
的长度。对于从k
到1
的{{1}},请N-1
。如果T_k = S * k / N
是整数,则找到大小为T_k
的{{1}}的子集,其总和为A
。如果你能做到这一点,那么你已经完成了。如果您不能对任何k
执行此操作,则不存在此类分区。
这是这种方法背后的数学。假设存在T_k
的分区,使得两个部分具有相同的平均值,大小为k
A
,大小为X
的{{1}}为分区,x
。那你必须
Y
所以一些代数给出了
y
由于数组包含整数,因此左侧是整数,因此右侧也必须如此。这激发了x+y = N
必须是整数的约束。剩下的唯一部分是将sum(X)/x = sum(Y)/y = (sum(A)-sum(X)) / (N-x)
视为大小为sum(X) = sum(A) * x / N
的子集的总和。