Я ищу алгоритм с наименьшей сложностью во времени, который решал бы вариант задачи идеальной суммы (изначально: поиск всех комбинаций подмножеств переменного размера из массива [*] целых чисел размера n
, сумма которого до указанного c число x
), где размер комбинации подмножества имеет фиксированный размер k
и возвращает возможные комбинации без прямых, а также косвенных (когда есть комбинация, содержащая точно такие же элементы из другого в другом порядке) дублируется.
Я знаю, что эта проблема является NP-сложной, поэтому я не ожидаю идеального общего решения, но что-то, что могло бы, по крайней мере, работать в разумное время в моем случае, с n
близко к 1000 и k
около 10
Вещи, которые я пробовал до сих пор:
Поиск комбинации, а затем выполнение последовательных модификаций ее и ее модификаций
Предположим, я есть массив, например:
s = [1,2,3,3,4,5,6,9]
Итак, у меня есть n = 8
, и я бы хотел x = 10
для k = 3
Я нашел благодаря некоему непонятному методу (грубой силе?) Подмножество [3,3,4]
Из этого подмножества я нахожу другие возможные комбинации, вынимая из него два элемента и заменяя их другими элементами, сумма которых одинакова, т.е. (3, 3)
можно заменить на (1, 5)
, поскольку оба имеют одинаковую сумму, а заменяющие числа еще не используются. Итак, я получаю другое подмножество [1,5,4]
, затем повторяю процесс для всех полученных подмножеств ... бесконечно?
Основная проблема, предлагаемая здесь, заключается в том, что трудно определить, когда это будет сделано, и этот метод скорее чаоти c. Я придумал несколько вариантов этого метода, но они действительно находятся в стадии разработки.
- Перебор набора для перечисления всех
k
длинных комбинаций, которые в сумме составляют x
Довольно понятно. Это наивный метод, который в моем случае не работает, так как у меня есть довольно большие n
и k
, которые недостаточно малы, чтобы избежать катастрофически большого количества комбинаций (величина количества комбинаций равна 10. ^ 27!)
Я экспериментировал с несколькими механизмами, связанными с установкой области исследования, вместо того, чтобы тупо перебирать все возможности, но это довольно сложно и все еще продолжается
Что бы вы посоветовали? (Фрагменты могут быть на любом языке, но я предпочитаю C ++)
[*] Чтобы снять сомнения относительно того, может ли базовая коллекция содержать дубликаты, я использовал термин «массив» вместо «установить» в точнее. Коллекция может содержать повторяющиеся целые числа в моем случае и довольно много, с 70 разными целыми числами для 1000 элементов (количество округлено), например