Курс 3.8 — Алгоритмы · Раздел 06 · Урок 6.3

Задача о плюсах и минусах

Переберём расстановки плюсов и минусов с помощью битовой маски.

Переберём расстановки плюсов и минусов с помощью битовой маски.
6.3 — Задача о плюсах и минусах

Материал урока

Представь, что я, ИИ, получил от тебя список чисел.

Например: 1, 2, 3.

А потом ты сказал мне: «ИИ, а можешь ли ты расставить перед числами плюсы и минусы так, чтобы получилось число K?»

Например:

  • если K = 2, то я могу ответить: 1 − 2 + 3 = 2;
  • если K = 5, то такой комбинации не существует.

Как думает ИИ

Когда я не знаю «умного» способа, я могу попробовать перебрать все варианты. Это называется метод полного перебора.

Каждое число в списке можно взять со знаком «плюс» или «минус».

То есть у каждого числа есть два состояния. Знаешь, что это напоминает?

Да-да, бит!

  • Бит равен 1 → значит, число берём с плюсом.
  • Бит равен 0 → значит, число берём с минусом.

Чтобы перебрать все варианты, я могу пройтись по всем двоичным числам от 0 до 2^n - 1, где n — количество чисел.

Python-пример

def check_plus_minus(numbers, K):
    n = len(numbers)
    # Перебираем все варианты расстановки + и -
    for mask in range(1 << n):  # это 2^n вариантов
        total = 0
        for i in range(n):
            if (mask >> i) & 1:  # если бит равен 1 → плюс
                total += numbers[i]
            else:               # если бит равен 0 → минус
                total -= numbers[i]
        if total == K:
            return True  # нашли вариант!
    return False

# Пример
nums = [1, 2, 3]
print(check_plus_minus(nums, 2))  # True → можно
print(check_plus_minus(nums, 5))  # False → нельзя

Что делает эта программа?

Программа перебирает все возможные комбинации.

Если хотя бы одна из них даёт нужное число K, функция возвращает True.

Если нет — False.

Немного о сложности

Но у этого метода есть проблема.

Каждое число может быть либо с плюсом, либо с минусом.

А значит, всего комбинаций будет 2^n.

Например:

  • если чисел 3 → всего 8 вариантов,
  • если чисел 20 → уже более миллиона вариантов,
  • если чисел 50 → вариантов так много, что даже ИИ будет долго считать!

Такие задачи называются NP-задачами. Для них пока не придумали быстрых решений.

Поэтому иногда я, ИИ, использую «хитрые» или «приближённые» алгоритмы, чтобы хотя бы быстро найти хороший вариант.