0Pricing
Competitive Programming Academy · Урок

Сумма подмножества и разбиение

Получайте цель с помощью выбранного подмножества

«Сумма подмножества и разбиение» — бесплатный урок Competitive Programming Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Competitive Programming Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Competitive Programming Academy содержит 4 уроков всего.

Задача о сумме подмножества

Даны числа и целевая сумма. Может ли какое-либо подмножество дать ровно эту сумму? Это задача о рюкзаке, где ценность равна весу.

Булево DP, а не значения

Здесь нужно отслеживать достижимость, а не максимум. Пусть dp[s] равно True, если существует подмножество с суммой ровно s.

dp = [False] * (target + 1)
dp[0] = True

Ноль достижим всегда

Пустое подмножество имеет сумму ноль, поэтому dp[0] изначально равно True. Все остальные суммы начинаются со значения False, пока какое-либо число не сделает их достижимыми.

Переход

Для каждого числа отметьте s как достижимую сумму, если s - num уже была достижима. Одно число может сделать истинными сразу несколько сумм.

for num in nums:
    for s in range(target, num - 1, -1):
        dp[s] = dp[s] or dp[s - num]

Снова в обратном порядке

Каждое число можно использовать не более одного раза, поэтому внутренний цикл выполняется в обратном порядке, как в рюкзаке 0/1. Прямой порядок привёл бы к повторному использованию числа.

Прочитайте вердикт

После обработки всех чисел dp[target] отвечает на вопрос. True означает, что подходящее подмножество существует, а False — что это невозможно.

Переходим к разбиению

Задача о разбиении спрашивает: можно ли разделить массив на две части с одинаковой суммой? Она напрямую сводится к задаче о сумме подмножества.

Разделите общую сумму пополам

Если общая сумма нечётная, равные части невозможны, поэтому сразу ответьте «нет». Иначе целевая сумма — это просто total // 2.

total = sum(nums)
if total % 2:
    return False
target = total // 2

Снова используйте сумму подмножества

Теперь просто проверьте, может ли подмножество дать total // 2. Если одна часть достигает цели, оставшиеся элементы автоматически образуют соответствующую вторую часть.

Сложность

Стоимость составляет порядка n, умноженного на target, — это псевдополиномиальная оценка. Алгоритм работает быстро при небольшой цели и медленно при огромных суммах.

Одно семейство задач

Задачи о сумме подмножеств, разбиении и рюкзаке 0/1 используют один механизм. Распознайте схему «взять или пропустить» — и сможете повторно использовать тот же цикл.

Быстрая проверка

Проверьте сведение задачи о разбиении.

Повторение

Вы решили задачу о сумме подмножеств с помощью логического DP и обратного цикла, а затем свели задачу о разбиении к достижению значения total // 2. Тот же механизм — новые победы. ✅

Часто задаваемые вопросы

Урок «Сумма подмножества и разбиение» бесплатный?

Да — полный текст урока «Сумма подмножества и разбиение» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Competitive Programming Academy, подпишись на CoddyKit PRO. Курс Competitive Programming Academy содержит 4 уроков всего.

Чему я научусь в уроке «Сумма подмножества и разбиение»?

Получайте цель с помощью выбранного подмножества Ты практикуешь Competitive Programming Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Competitive Programming Academy?

Предыдущий опыт не требуется. Competitive Programming Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Сумма подмножества и разбиение»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Competitive Programming Academy?

Да. Каждый урок Competitive Programming Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Рюкзак 0/1: взять или оставить
  2. Рюкзак с оптимизацией памяти
  3. Неограниченный рюкзак и DP для размена монет
  4. Сумма подмножества и разбиение
← Назад к Competitive Programming Academy