Найти количество подмножеств чья сумма меньше или равна указанного числа К; Ограничения: максимальное число элементов множества 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/2
N/2+1, ... , N
Для каждой суммы нужно добавить к ответу число сумм из пункта 1 меньше k - Summ
. (для этого лучше использовать бинарный поиск).Кстати может быть полезно Всевозможные произведения в массиве
Код пока не пишу. Возникнут вопросы - добавлю.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
У меня возникла проблема с пониманием синтаксисаУвидел вот такой конструктор:
Подскажите, пожалуйста, как сделать, чтобы слова из массива выводились в таком виде: то есть, чтобы на строчку влезало разное количество слов,...
У меня есть плеер, в котором можно скачивать песниДля скачивания на данный момент я использую IntentService, который выглядит вот так: