Это в основном работает для разделения a
на две части с суммами абсолютных значений двух частей, максимально близкими к равным.
Затем вы хотите умножить эти элементы на 1 или -1, чтобы сделать один раздел полностью отрицательным, а другой - положительным. Делая это, вы суммируете их, чтобы получить окончательный ответ.
С алгоритмической точки зрения, я полагаю, что шаг разделения почти наверняка является NP-полностью (на ум приходят такие фразы, как «сумма подмножеств» и «проблема разбиения»). С точки зрения программирования это довольно просто - исчерпывающе тестируйте возможности, пока не получите лучший. Пока количество элементов мало (до десятка или около того [править: так как это O (2 N , вы, вероятно, можете увеличить его до где-то в диапазоне 30-40), это будет достаточно быстро.
Я полагаю, что он должен быть пропорционален O (N!), Поэтому, если массив становится вообще большим, время, потраченное на него, быстро станет неразумным. Поскольку вы делитесь только на два набора и порядок внутри наборов не имеет значения, это O (2 N ) вместо O (N!). Это растет не так быстро, как O (N!), Но все же достаточно быстро, чтобы сделать большие наборы неразумными для обработки.
Я должен добавить, однако, что Codility, похоже, специализируется на проблемах, которые изначально могут показаться NP-завершенными, но на самом деле это не так - если вы пропустили любую деталь в своем описании, проблема может быть значительно проще.
Редактировать: перечитывая его, проблема может заключаться в том, что I игнорирует важную деталь: ограниченный диапазон. Я не уверен, как вы используете его не по назначению, но я уверен, что это крайне важно для выработки эффективного решения. Мое непосредственное предположение состоит в том, что это основано на чем-то похожем на изменение сортировки на основе сравнения на сортировку (иначе называемую). Хотя я не продумал это до мелочей ...
Edit2: Делая небольшой взгляд (и получая подсказку от @Moron), ограниченный диапазон важен, и мои мысли о том, как оно превращается в решение, были в целом правильными. @ Морон был достаточно любезен, чтобы указать на запись в Википедии для проблемы подмножества сумм, но я не нашел это особенно хорошо написанным. Немного осмотревшись, я обнаружил бумагу из Корнелла с объяснением, которое я нашел немного чище / более понятным.