Скажем, что у меня есть массив чисел S = [6, 2, 1, 7, 4, 3, 9, 5, 3, 1]. Я хочу разделить на три массива. Порядок количества и количества элементов в этом массиве не имеет значения.
Пусть говорят, что A1, A2 и A3 являются вспомогательными массивами. Я хочу свести к минимуму функцию
f(x) = ( SUM(A1) - SUM(S) / 3 )^2 / 3 +
( SUM(A2) - SUM(S) / 3 )^2 / 3 +
( SUM(A3) - SUM(S) / 3 )^2 / 3
- Мне не нужно оптимальное решение; Мне просто нужно хорошее решение.
- Я не хочу, чтобы алгоритм был слишком медленным. Я могу обменять некоторую скорость для лучшего результата, но я не могу торговать слишком много.
- Длина S составляет от 10 до 30.
Почему
Почему мне нужно решить эту проблему? Я хочу красиво расположить ящик на три столбца, так что общая высота каждой колонки не слишком отличается друг от друга.
Что я пробовал
Мой первый инстинкт - использовать жадные. Результат не так уж плох, но он не обеспечивает оптимальное решение. Есть ли лучший способ?
s = [6, 2, 1, 7, 4, 3, 9, 5, 3, 1]
s = sorted(s, reverse=True)
a = [[], [], []]
sum_a = [0, 0, 0]
for x in s:
i = sum_a.index(min(sum_a))
sum_a[i] += x
a[i].append(x)
print(a)