如何将一个数组分成两个部分,使得这两部分的平均值相等?每个部分可能包含在数组中不连续的元素。 我所知道的唯一算法是指数级别的,我们能否做得更好?
如何将一个数组分成两个部分,使得这两部分的平均值相等?每个部分可能包含在数组中不连续的元素。 我所知道的唯一算法是指数级别的,我们能否做得更好?
A
。计算 S = A[0] + ... + A[N-1]
,其中 N
是数组 A
的长度。对于 k
从 1
到 N-1
,令 T_k = S * k / N
。如果 T_k
是整数,则找到一个大小为 k
的 A
的子集,使其元素之和为 T_k
。如果你能够找到这样的子集,则问题解决。如果对于任何 k
都无法找到这样的子集,则不存在这样的分组。
A
分成两部分的方式,使得这两部分的平均值相等,其中大小为x
的X
和大小为y
的Y
是划分的部分,其中x+y=N
。那么必须满足以下条件:sum(X)/x = sum(Y)/y = (sum(A)-sum(X)) / (N-x)
所以一点代数运算可以得到
sum(X) = sum(A) * x / N
由于数组包含整数,左侧是一个整数,所以右侧也必须是整数。这激励了一个约束条件,即 T_k = S * k / N
必须是整数。唯一剩下的部分就是将 T_k
实现为大小为 k
的子集之和。