Ковбой Джо хочет украсть ровно n долларов, ни долларом больше, ни долларом меньше. Помогите ему или сообщите, что его план неосуществим.
Формат входных данных:
В первой строке даны целые числа n,m ( 1<= n <= 10^9, 1<= m <= 10 ) — необходимая ковбою Джо сумма и количество номиналов купюр.
Во второй строке вводятся m попарно различных целых чисел a1,a2,…,am ( 1<= ai <= 10^9 ) — существующие номиналы купюр.
Формат выходных данных:
Если ковбой Джо сможет украсть ровно n долларов, выведите число k — количество украденных купюр. Затем выведите k целых чисел — номиналы купюр. Если решений несколько, вы можете вывести любое.
В противном случае выведите −1.
python
n, m = map(int, input().split()) # считываем значение n и м
a = list(map(int, input().split())) # считываем номиналы купюр
inf = float('inf') # значение бесконечности
dp = [inf] * (n + 1) # инициализируем массив dp
dp[0] = 0 # dp[0] = 0, так как нам не нужно ни одной купюры, чтобы получить сумму 0
for i in range(1, n + 1):
for j in range(m):
if i >= a[j]:
dp[i] = min(dp[i], dp[i - a[j]] + 1)
if dp[n] == inf: # если значение dp[n] осталось бесконечностью
print(-1) # выводим -1
else:
ans = [] # массив для хранения номиналов купюр
i = n
while i > 0:
for j in range(m):
if i >= a[j] and dp[i] == dp[i - a[j]] + 1:
ans.append(a[j])
i -= a[j]
break
print(len(ans)) # выводим количество украденных купюр
print(*ans) # выводим номиналы купюр
Давайте разберем пример работы алгоритма:
Входные данные:
10 3
1 2 5
Выходные данные:
3
5 2 2
В этом примере нам нужно украсть 10 долларов, а доступные номиналы купюр - 1, 2 и 5. Минимальное количество купюр, необходимых для получения суммы 10, равно 3. Одно из возможных решений - 5 + 2 + 2.
Алгоритм также работает для других входных данных. Он эффективен и имеет полиномиальную сложность времени O(n * m), где n - сумма денег, а m - количество номиналов купюр.Нажимая «Регистрация» или «Войти через Google», вы соглашаетесь с Публичной офертой, даете Согласие на обработку персональных данных, а также подтверждаете что вам есть 18 лет
Нажимая «Регистрация» или «Войти через Google», вы соглашаетесь с Публичной офертой, даете Согласие на обработку персональных данных, а также подтверждаете что вам есть 18 лет