Advertisement
sacr1ficerq

Первая

May 4th, 2022
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.73 KB | None | 0 0
  1. nominals = [1, 10, 100, 500]
  2.  
  3. s = int(input("Введите сумму: "))
  4.  
  5. INF = 10**6
  6.  
  7. a = [INF]*(s+1) # Под индексом i массиве будет лежать минимальное количество монет в суммы i
  8. from_ = [-1] * (s+1) # Под индексом i массиве будет лежать сумма, от которой мы сюда попали
  9.  
  10. for i in nominals:
  11.     if i <= s:
  12.         a[i] = 1
  13.         from_[i] = 0
  14.  
  15. for i in range(1, s+1):   # Считаем путь до каждой суммы до нужной
  16.     for stepback in nominals:   # Смотрим, откуда мы можем попасть в эту сумму
  17.         if i <= stepback: # Если номинал монеты превосходит размер суммы
  18.             continue
  19.         previous = a[i-stepback] + 1    # Путь до суммы от потенциального предыдущего элемента + 1
  20.         if a[i] > previous: # Если можно добраться быстрее, чем указано у нас в массиве
  21.             from_[i] = i - stepback
  22.             a[i] = previous
  23.  
  24. print("Купюр и монет: ", a[s])
  25.  
  26. # Восстанавливаем ответ
  27. to = s
  28. answer = [0]*4
  29. while from_[to] != -1:  # Просто идем по предыдущим элементам и собираем "прыжки"
  30.     stepback = to - from_[to]
  31.     if stepback == 1:
  32.         answer[0] += 1
  33.     if stepback == 10:
  34.         answer[1] += 1
  35.     if stepback == 100:
  36.         answer[2] += 1
  37.     if stepback == 500:
  38.         answer[3] += 1
  39.     to = from_[to]
  40.  
  41. print("1:", answer[0])
  42. print("10:", answer[1])
  43. print("100:", answer[2])
  44. print("500:", answer[3])
  45.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement