Найти количество подмножеств чья сумма меньше или равна указанного числа К; Ограничения: максимальное число элементов множества n = 40, каждое не должно превышать 10^16 и самое главное: время выполнения работы до 0.5 секунд и использование не больше 20МБ ОЗУ
Пример:
Ввод:
n = 5, s = 1000,
a[n] = { 100, 500, 500, 1500, 1000 }
Вывод:
v = 7 + 1 (пустое подмножество) = { {пустое}, {100}, {500}, {100+500}, {500}, {100+500}, {1000}, {500+500} }
Пытался решить простым перебором сумм всех возможных подмножеств, но при н > 20 время выполнения работы экспоненциально растет.
Если кто может объяснить как работает это метод буду крайне благодарен.
Нашел такое вот объяснение:
Не очень понял третий пункт.
Это классическая задача на иллюстрацию принципа "встречи посередине", который кстати часто используется в криптографии.
Этот метод применяется (обычно) когда нужно решать NP - полную задачу. Метод сокращает с O(2^N) до O(2^N/2) что обычно в разы лучше.
Если нам нужно вычислить число наборов, таких что F[a1,a2,...,an] = X и мы имеем возможность эффективно вычислить обратную F^-1 (т.е в идеале операция обратима и редуцируется до некого просто цикла с одним аккумулятором). Например для сложения это тоже сложение (окей вычитание), для умножения - деление (в кольце обычно), для побитового или оно само и тому подобное. То можно сделать следующую операцию.
F^-1[X, al, al+1, ... , an] (всю таблицу). Поясню. Смысл этой операции - мы должны получить значение аккумулятора, такое что после добавления этой части массива мы получим в результате число X {a1,a2,...,al-1} Для каждого набора вычисляем F[a1,a2,...,al-1]=Y После чего берём из таблицы пункта 3 набор для которого F^-1 = Y В данном случае случай канонический.
1,2...N/2N/2+1, ... , N Для каждой суммы нужно добавить к ответу число сумм из пункта 1 меньше k - Summ. (для этого лучше использовать бинарный поиск).Кстати может быть полезно Всевозможные произведения в массиве
Код пока не пишу. Возникнут вопросы - добавлю.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости