Насколько я понимаю, нам дан массив A
размера 2k
, и мы хотим найти два непересекающихся подмассива S1, S2
размера k
так, чтобы средние значения этих подмассивов были ближе всего к средним A
.
Мы можем измерить это отклонение с помощью абсолютного значения:
dev(S1) = abs(avg(S1) - avg(A))
dev(S2) = abs(avg(S2) - avg(A))
И мы хотим минимизировать общее отклонение
dev(S1) + dev(S2)
Средние значения:
avg(A) = 1/2k * sum_i A_i
avg(S1) = 1/k * sum_i S1_i
avg(S2) = 1/k * sum_i S2_i
Поскольку элементы S2
являются элементами A
, которых нет в S1
, мы можем заменить
avg(S2) = 1/k * (sum_i A_i - sum_j S_j)
Объединяя все это в нашу цель, мы хотим минимизировать
dev(S1) + dev(S2)
= abs(1/k * sum_i S1_i - 1/2k * sum_i A_i) + abs(1/k * (sum_i A_i - sum_j S_j) - 1/2k * sum_i A_i)
= abs(1/k * sum_i S1_i - 1/2k * sum_i A_i) + abs(-1/k * sum_j S_j + 1/2k * sum_i A_i)
= 2 * abs(1/k * sum_i S1_i - 1/2k * sum_i A_i)
Поскольку k
является постоянным, мы можем вычленить его и получить конечную цель (без постоянных масштабов)
abs(sum_i S1_i - 1/2 * sum_i A_i)
Поэтому наша цель - выбрать k
элементов из A
так, чтобы их сумма была ближе к половине суммы A
.
Решить эту проблему нелегко. Посмотрите на этот вопрос для некоторых идей. В качестве альтернативы вы можете использовать приблизительный итеративный подход: начать с любого набора из четырех чисел. Затем попытайтесь заменить любое число, чтобы приблизить результат к желаемой сумме. Это может застревать в локальных минимумах, поэтому не ожидайте найти лучшее решение в любом случае.