Основываясь на ответе awesomo ... если мы можем предположить, что числа отсортированы, мы можем сделать лучше, чем O (n ^ k) для данного k; просто возьмите все O (n ^ (k-1)) подмножеств размера (k-1), затем выполните бинарный поиск того, что осталось для числа, которое при добавлении к первому (k-1) дает цель. Это O (n ^ (k-1) log n). Это означает, что сложность, конечно, меньше, чем это.
На самом деле, если мы знаем, что сложность O (n ^ 2) для k = 3, мы можем сделать еще лучше для k> 3: выбрать все (k-3) -подмножества, из которых есть O ( n ^ (k-3)), а затем решите задачу в O (n ^ 2) на оставшихся элементах. Это O (n ^ (k-1)) для k> = 3.
Однако, может быть, вы можете сделать еще лучше? Я подумаю об этом.
РЕДАКТИРОВАТЬ: Первоначально я собирался добавить многое, предлагая другой взгляд на эту проблему, но я решил опубликовать сокращенную версию. Я призываю других авторов посмотреть, верят ли они в эту идею. Анализ сложный, но он может быть достаточно сумасшедшим, чтобы работать.
Мы можем использовать тот факт, что у нас есть фиксированное k и что суммы нечетных и четных чисел ведут себя определенным образом, чтобы определить рекурсивный алгоритм для решения этой проблемы.
Во-первых, измените задачу так, чтобы в списке были четные и нечетные числа (это можно сделать, разделив на два, если все четные, или вычтя 1 из чисел и k из целевой суммы, если все нечетные и повторяя при необходимости).
Далее используйте тот факт, что четные целевые суммы могут быть достигнуты только с использованием четного числа нечетных чисел, а нечетные целевые суммы могут быть достигнуты с использованием только нечетного числа нечетных чисел. Создайте соответствующие подмножества нечетных чисел и рекурсивно вызовите алгоритм, используя четные числа, сумма минус сумма исследуемого поднабора нечетных чисел, а k минус размер подмножества нечетных чисел. Когда k = 1, выполните бинарный поиск. Если когда-либо k> n (не уверен, что это может произойти), верните false.
Если у вас очень мало нечетных чисел, это может позволить вам очень быстро подобрать термины, которые должны быть частью выигрышного поднабора, или отбросить те, которые не могут. Вы можете преобразовать задачи с множеством четных чисел в эквивалентные задачи с множеством нечетных чисел, используя метод вычитания. Поэтому наихудший случай должен быть, когда числа четных и нечетных чисел очень похожи ... и вот где я сейчас. Бесполезно свободная верхняя граница этого на много порядков хуже грубой силы, но я чувствую, что это, вероятно, по крайней мере так же хорошо, как грубая сила. Мысли приветствуются!
РЕДАКТИРОВАТЬ 2: Пример выше, для иллюстрации.
{1, 2, 2, 6, 7, 7, 20}, k = 3, sum = 20.
Subset {}:
{2, 2, 6, 20}, k = 3, sum = 20
= {1, 1, 3, 10}, k = 3, sum = 10
Subset {}:
{10}, k = 3, sum = 10
Failure
Subset {1, 1}:
{10}, k = 1, sum = 8
Failure
Subset {1, 3}:
{10}, k = 1, sum = 6
Failure
Subset {1, 7}:
{2, 2, 6, 20}, k = 1, sum = 12
Failure
Subset {7, 7}:
{2, 2, 6, 20}, k = 1, sum = 6
Success