如何将数组分成2个部分,使这两个部分具有相等的平均值?

时间:2012-01-18 17:58:05

标签: arrays algorithm data-structures

如何将数组分成2个部分,使这两个部分具有相等的平均值?每个分区可能包含数组中不连续的元素。 我能想到的唯一算法是指数可以做得更好吗?

1 个答案:

答案 0 :(得分:15)

您可以将此问题减少到sum-subset problem - 也cached here。这是想法。

A成为数组。计算S = A[0] + ... + A[N-1],其中NA的长度。对于从k1的{​​{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 的子集的总和。