Это не проблема программирования, это проблема комбинаторики с теоретическим, а не эмпирическим подходом к ее решению.Вы можете просто напечатать правильное решение и не перебирать любые разделы.
Почему это так?
Let
т.е. z - это часть суммы всех s элементов, находящихся в s 1 .Утверждается, что
и, следовательно, произведение обоих множеств удовлетворяет:
В зависимости от z (не от x и y) эта парабола достигает максимума при z = 1/2;и нет других локальных точек максимума, то есть приближение к 1/2 обязательно увеличивает этот продукт.Таким образом, вы хотите разделить полный набор так, чтобы каждый из s 1 и s 2 был как можно ближе к половине суммы элементов.
В общем, вам, возможно, приходилось использовать программирование для рассмотрения нескольких подмножеств, но поскольку ваши элементы задаются формулой - а это формула геометрической последовательности .
Сначала давайтепредположим, x> = 2 и y> = 2, иначе это неинтересная проблема.
Теперь для x> = 2 мы знаем, что
(сумма геометрической последовательности) и, таким образом,
т.е. последний элемент всегда перевешивает все остальные элементы вместе взятые,Вот почему вы всегда хотите выбрать {x y } как s 1 и как все другие элементы как s 2 .Нет необходимости запускать какую-либо программу.Затем вы также можете легко рассчитать оптимальный продукт сумм.
Примечание: Если мы не делаем предположений об элементах s, за исключением того, что они являются неотрицательными целыми числами, находимОптимальным решением является оптимизационная версия проблемы Partition , которая является NP-полной.Это очень грубо означает, что не существует решения, которое было бы гораздо более эффективным, чем просто пробовать все возможные комбинации.