На Диком западе ходят купюры номиналами a1, a2,…,am долларов. Однажды ковбой Джо решил ограбить банк. Он выбрал очень неудачный момент для ограбления, ведь сейчас в банке находятся ровно по две купюры каждого существующего номинала.
Ковбой Джо хочет украсть ровно n долларов, ни долларом больше, ни долларом меньше. Помогите ему или сообщите, что его план неосуществим.
Формат входных данных:
В первой строке даны целые числа n,m ( 1<= n <= 10^9, 1<= m <= 10 ) — необходимая ковбою Джо сумма и количество номиналов купюр.
Во второй строке вводятся m попарно различных целых чисел a1,a2,…,am ( 1<= ai <= 10^9 ) — существующие номиналы купюр.
python
def find_combination(target, denominations, count):
# Базовый случай: если желаемая сумма равна 0, значит мы собрали нужную комбинацию купюр
if target == 0:
return True
# Базовый случай: если все номиналы купюр перебраны или желаемая сумма отрицательна, значит комбинацию невозможно собрать
if count == 0 or target < 0:
return False
# Рекурсивный случай: мы можем использовать каждую купюру не более двух раз
for i in range(min(2, target // denominations[count-1]) + 1):
# Вызываем функцию рекурсивно для уменьшенной желаемой суммы и следующих номиналов купюр
if find_combination(target - i * denominations[count-1], denominations, count - 1):
return True
# Если не нашли комбинацию, возвращаем False
return False
Используя эту функцию, мы можем проверить, существует ли возможность собрать заданную сумму:
python
def can_rob_bank(n, m, denominations):
# Сортируем номиналы купюр по возрастанию
denominations.sort()
# Вызываем рекурсивную функцию для поиска комбинации купюр
return find_combination(n, denominations, m)
Теперь мы можем использовать эту функцию, чтобы проверить, существует ли возможность ограбить банк:
python
n, m = map(int, input().split())
denominations = list(map(int, input().split()))
if can_rob_bank(n, m, denominations):
print("Джо может ограбить банк!")
else:
print("Джо не может ограбить банк...")
В данном решении мы используем рекурсию для перебора всех возможных комбинаций купюр. Такой подход может быть эффективным, если количество номиналов купюр и желаемая сумма небольшие. Однако, если у нас большое количество номиналов купюр или большая желаемая сумма, то такое решение может быть неэффективным. В таком случае, можно применить динамическое программирование для оптимизации решения.Нажимая «Регистрация» или «Войти через Google», вы соглашаетесь с Публичной офертой, даете Согласие на обработку персональных данных, а также подтверждаете что вам есть 18 лет
Нажимая «Регистрация» или «Войти через Google», вы соглашаетесь с Публичной офертой, даете Согласие на обработку персональных данных, а также подтверждаете что вам есть 18 лет