Ctrl K

Наборы с ограниченным весом

Сложная
На складе лежат предметы, их веса — в массиве weights (предметы одного веса неотличимы друг от друга). Нужно собрать посылку, вес которой — сумма весов вложенных предметов — лежит в отрезке от low до high включительно. Посчитайте, сколько существует **различных** посылок. Две посылки одинаковы, если в них одно и то же количество предметов каждого веса. Предмет веса x можно положить не больше раз, чем он встречается в weights. Пустая посылка имеет вес 0. Ответ может быть большим — верните его по модулю 10⁹ + 7.
Пример 1
weights=[1, 1, 3], low=2, high=4 → 3

Подходят наборы {1, 1} (вес 2), {3} (вес 3) и {1, 3} (вес 4). Набор {1, 3} считается один раз, хотя единицу можно взять двумя способами.

Пример 2
weights=[0, 2, 2], low=0, high=2 → 4

Подходят пустой набор, {0}, {2} и {0, 2}: невесомый предмет удваивает число вариантов.

Пример 3
weights=[5, 6], low=1, high=4 → 0
Ограничения
  • 1 ≤ len(weights) ≤ 2·10⁴
  • 0 ≤ weights[i] ≤ 2·10⁴
  • Сумма всех weights не больше 2·10⁴
  • 0 ≤ low ≤ high ≤ 2·10⁴
Встречал эту задачу на настоящем собесе?
Решили0
Пробовали0
Отправок0
Принято—
Темы
Похожие задачиДва отрезка с нужной суммой СредняяВсе способы расставить пробелы СложнаяМедиана в скользящем окне СложнаяСамый узкий отрезок для всех списков СложнаяОтрезки ровно с k видами Сложная
загружаем Python…
Вход
weights=[1, 1, 3], low=2, high=4
Ожидается
3

«Запустить» — первые 3 теста у тебя в браузере, «Отправить» — все 86 тестов на сервере, включая скрытые.