сколькими способами можно набрать 100 рублей используя монеты по 3 и 5 рублей
Олимпиадное хобби. Размен монет
Привет. Сегодня понедельник, поэтому я решил, что стоит начать свой рабочий день с разогрева пальцев и мозга. Для тех кто не в курсе: мое олимпиадное хобби состоит в решении олимпиадных задач по программированию, которые я беру с сайта http://uva.onlinejudge.org/. Сегодня нам предстоит решить задачу о размене монет из области динамического программирования. Задача не очень сложная, но есть над чем поразмыслить, поэтому заинтересовавшихся прошу под кат. К слову, это третья наша задача, но, безусловно, из всех самая интересная.
Небольшое лирическое отступление.
Мой программистский путь начался далеко не в 3 года, когда многие будущие программисты уже разбирали калькулятор и делали из него компьютер. Я начал заниматься программированием в школе в 8 классе. К слову сказать, моя школа была далека от технического направления, поэтому в своих начинаниях я был почти одинок. Но, благодаря директору нашей школы, у нас был «кружок» по программированию, где мы готовились к школьной олимпиаде по программированию. Нас там было не более трех человек единовременно, но нашего преподавателя, к счастью, это не расстраивало. Моим преподавателем программирования был Кавокин А.А., отчасти благодаря ему я и встал на столь удивительный путь программиста. Так вот, каждый урок наш наставник начинал с логической задачки, чтобы мы расшевелили свои извилины. Это мне настолько нравилось в школе, что я решил вас тоже так помучить, поэтому сегодня мы начнем с небольшой логической задачки, которая поможет нам размяться.
Логическая задачка для разминки:
В нашем городе проезд в общественном транспорте оплачивается непосредственно во время поездки, для чего по автобусу курсирует кондуктор, собирая со всех плату за проезд. Стоимость билета составляет 20 рублей. Однажды, на одной из остановок в автобус зашли 5 человек. Один из них молча заплатил кондуктору 100 рублей, и тот, не задавая никаких вопросов, отсчитал 5 билетов и отдал платившему. Вопрос: как кондуктор догадался, что оплата происходит сразу за всех пятерых, при условии, что ничто не указывало на то, что все они были вместе?
Позволю оставить задачу без ответа, потому что уверен в вашей сообразительности. А как только в комментариях появится правильный ответ, сразу вынесу ссылку сюда.
UPD: Ответ найден в комментарии пользователя ogra
Условие
Надеюсь задачка, которую я вам подкинул для разогрева, успешно подействует на вашу мозговую активность. Сейчас мы, наконец-то займемся решением олимпиадной задачи. Наша сегодняшняя задача — это задача о размене монет.
Краткий перевод условия задачи
После закупки в большом универмаге Мелу досталась сдача в размере 17 центов. Он получил одну десятицентовую монету, одну пятицентовую и 2 монеты по 1 центу. Позже, в этот же день, он делал покупки в мини-маркете, где тоже получил сдачу в размере 17 центов. На этот раз он получил две монеты по 5 центов и 7 монет по 1 центу. Тогда Мел задался вопросом: «Как много магазинов я могу посетить и получить сдачу в 17 центов различным набором монет?» После небольшого мозгового штурма, он определил, что ответ 6. Тогда он бросил вызов вам для решения более общего случая.
Напишите программу, которая определит количество различных комбинаций американских монет(1 цент, 5 центов, 10 центов, 25 и 50 центов), которые могут сложиться в определенную сумму.
Входные данные: ввод будет состоять из множества чисел между 0 и 30000 включительно, по одному в каждой строке.
Выходные данные: на каждое входное число, нужно определить число комбинаций и вывести, как показано в примере.
Output:
There are 6 ways to produce 17 cents change.
There are 4 ways to produce 11 cents change.
There is only 1 way to produce 4 cents change.
Как обычно, рекомендую вам самим попытаться решить задачу. А как только решите, возвращайтесь к нам и хвастайтесь своим результатом.
Решение
Задача явно из области динамического программирования, а такие задачи, как правило, решаются с помощью рекурсивных зависимостей. Нам необходимо определить, какая именно рекурсивная зависимость в нашем случае.
Можно сразу заметить, что число комбинаций не отличается при сдаче от 1 цента до 4 — это 1 вариант, при сдаче от 5 центов до 9 — это 2 варианта, при сдаче от 10 центов до 14 — это 4 варианта и т.д. Это происходит потому, что внутри такой «пятерки» монеты достоинством в 1 цент невозможно ничем заменить. Таким образом мы определили, что решать задачу для каждого числа бессмысленно, поэтому мы будем решать ее для каждой «пятерки».
Также можно заметить, комбинации для каждой следующей «пятерки» точно повторяют комбинации предыдущей «пятерки» (с добавлением в конец комбинации нужного числа монет по 1 центу) и некоторого числа новых комбинаций. Становится понятным, что число комбинаций следующей «пятерки» имеет зависимость от числа комбинаций предыдущих «пятерок». Нарисуем таблицу, где столбцами будут «пятерки», а строками виды монет, а на пресечении будет определяться, какое количество новых комбинаций породил данных вид монет ( в комбинации со всеми более мелкими) на конкретном шаге — «пятерке»:
1 | 5 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 | 55 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
5 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
10 | 0 | 0 | 1 | 1 | 2 | 2 | 3 | 3 | 4 | 4 | 5 | 5 |
25 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 2 | 2 | 3 | 4 | 5 |
50 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
∑ | 1 | 2 | 4 | 6 | 9 | 13 | 18 | 24 | 31 | 39 | 50 | 62 |
В последней строке выведено число комбинаций на данной «пятерке»
К примеру: на шаге 35 (8 пятерка: 35-39)
имея только 1 центовую монету, новых комбинаций не появляется,
из монет 1 цент и 5 центов, можно выдумать 1 новую комбинацию: 5+5+5+5+5+5+5+1(от 0 до 4)
1 цент, 5 центов, 10 центов — 3 комбинации: 10+10+10+5+1(от 0 до 4), 10+10+5+5+5+1, 10+5*5+1
1, 5, 10, 25 — 2 новых комбинации: 25+10+1, 25+5+5+1
Число новых комбинаций на каждом шаге из монет 1 цент и 5 центов равняется 1, потому что это комбинация порождается добавлением 5 центовой монеты к предыдущей комбинации. Т.е. для второй пятерки 5+1, потом 5+5+1, потом 5+5+5+1 и т.д., по 1 новой комбинации на каждом шаге.
Также в этой таблице не трудно углядеть рекурсивную зависимость: число новых комбинаций на шаге i, составленных из монет 1-10 равняется числу новых комбинаций из монет 1-5 на шаге i-1 плюс число новых комбинаций из монет 1-10 на шаге i-2 (когда у нас в распоряжении было на 1 десятицентовую монету меньше). Аналогично для 25-ти центовой монеты и 50-ти центовой монеты.
В итоге мы имеем 2 формулы и 3 рекурсивных зависимости:
N(1, i) = 0, кроме N(1, 0) = 1
N(5, i) = 1
N(10, i) = N(5, i-1) + N(10, i-2)
N(25, i) = N(10, i-3) + N(25, i-5)
N(50, i) = N(25, i-5) + N(50, i-10)
S(i) = S(i-1) + N(1, i) + N(5, i) + N(10, i) + N(25, i) + N(50, i)
Где N — это матрица, определенная выше, а S — искомое число комбинаций.
Теперь нам остается лишь просчитать нужное число шагов от начала до запрашиваемой «пятерки», подсчитывая на каждом шаге общее число комбинаций (S). Учитывая тот факт, что тестов в задаче будет много, можно использовать для новых тестов, ранее просчитанный кусок матрицы и дополнять лишь ее недостающую часть. Еще очень важно понимать, что при максимальной сумме, заданной условием задачи: 30000 центов, суммарное число комбинаций перевалит за пределы int и даже long, поэтому для подсчета числа комбинаций рекомендую использовать 8 байтовые беззнаковые переменные.
Полагаю, что есть более изящное решение, чем предложенное выше, но я его пока не вижу, поэтому жду от вас интересных алгоритмов. Мое решение на C++ можно скачать тут. Проверить правильность своего решения можно здесь (требуется регистрация). Удачи, господа!
Сколькими способами можно поменять 1 руб монетами 1, 2 и 5 коп
Доброго времени суток.
Помогите пожалуйста с несколькими простым тестовым заданием:
сколькими способами можно поменять 1 руб монетами 1, 2 и 5 коп
Сколькими способами можно разменять 10 копеек монетами по 1, 2, 3 и 5 копеек?
Помогите решить задачу пожалуйста «сколькими способами можно разменять 10 копеек монетами по 1 2 3.
Сколькими способами можно поменять марки
У одного мальчика 12 марок, а у второго 15. Сколькими способами можно поменять 4 марки первого.
Дана некоторая денежная сумма А руб. Определить, сколькими способами можно представить данную сумму «пятерками» и «десятками»?
интересная задача))) ток у меня каждый раз получается неправильно(((
Товар стоит «a» руб. «b» коп. За него заплатили «c» руб. «d» коп. Сколько сдачи требуется получить?
Товар стоит a руб. b коп. За него заплатили c руб. d коп. Сколько сдачи требуется получить.
интересненько.
1) есть 1-й вариант: 20 монет по 5 коп.
каждую 5 коп. монетку можно представить тремя способами:
5=2+2+1
5=2+1+1+1
5=1+1+1+1+1
В общем, у меня получилось: 1771 вариант
Выдача сдачи — 2
Имеется неограниченное количество монет в 1, 2, 5, 10 рублей. Определите, сколькими способами можно выдать сдачу в n рублей. Например, 5 рублей можно выдать четырьмя способами: 5=2+2+1=2+1+1+1=1+1+1+1+1.
Программа получает на вход натуральное число n, не превышающее 106.
Выведите ответ на задачу.
Правильное решение задачи можно написать, используя всего один цикл while.
Примеры
Ввод
2
100000
Вывод
2
1667116705001
Вот мой код, но в нём ошибка:
Выдача сдачи макс номиналом
Решить на С Решить с помощью оператора ветвления if else Задача в обращение.
Задача Выдача сдачи. Тема: Арифметика и числовые алгоритмы
Всем привет. Имеется неограниченное количество монет в 1, 2, 5, 10 рублей. Определите, сколькими.
Расчет сдачи
Товар стоит a руб. b коп. За него заплатили c руб. d коп. Сколько сдачи требуется получить.
Программа по расчету сдачи
Пользователем вводится или случайно генерируется число являющееся общей суммой необходимой для.
Ага. Там пробел
Результаты сдачи сессии
Результаты сдачи сессии по пяти экзаменам представлены в виде массива фамилий 30 студентов и.
Порядок сдачи экзаменов
Если студент учится в колледже. Если студент на парах четко работал получал положительные оценки.
Возврат сдачи с продукта
Задача: Программа возвращает вам сдачу в миллиардах, миллионах, тысячах, сотнях, рублях и копейках.
Сайт для сдачи зачета
Сейчас сдаю сайт, сам сайт готовый но надо сделать так, что бы все HTML файлы привязывались к.
Какова вероятность сдачи экзамена?
При подготовке к экзамену студент выучил 15 вопросов из 25, входящих в программу. Зачёт считается.
Учебник Моро 2 класс. 1 часть. Страница 16
1.Оля заплатила за марку две монеты по 50 копеек. Сколько стоила марка?
50 + 50 = 100 (к.) = 1 (р.) − стоила марка.
Ответ: 1 рубль стоила марка.
2. Как можно набрать 1 рубль одинаковыми монетами?
Решение
1 способ:
2 монеты по 50 к.
2 способ:
1 р. = 10 монет по 10 к.
3 способ:
1 р. = 20 монет по 5 к.
4 способ:
1 р. = 100 монет по 100 к.
3. Сколько монет и сколько копеек в каждом кошельке?
1 кошелек:
2 монеты
50 + 5 = 55 (к.)
2 кошелек:
3 монеты
50 + 10 + 1 = 60 + 1 = 61 (к.)
4. У Иры было две монеты: 5 р. и 2 р. На покупку тетрадей она израсходовала 6 р. Сколько рублей осталось у Иры?
5. За лето Саша прочитал 10 книг, а Лена − на 4 книги меньше. Поставь вопрос и реши задачу.
Вопрос: Сколько всего книг прочитали ребята?
1) 10 − 4 = 6 (книг) − прочитала Лена;
2) 10 + 6 = 16 (книг) − прочитали всего.
Ответ: 16 книг прочитали ребята.
6. Длина класса 6 м, а длина зала на 8 м больше. Узнай длину зала.
Решение
6 + 8 = 14 (м) − длина зала.
Задание 7
1 м = 10 дм
3 дм = 30 см
4 см = 40 мм
335. Сколькими способами можно разменять 50 рублей монетами в 1 и 5 рублей? Никольский С.М. Математика 5 класс
335.
Сколькими способами можно разменять 50 рублей монетами в 1 и 5 рублей?
11 способов, рассуждения аналогичны номеру 334.
По рисунку 50 определите, какая точка симметрична относительно точки О точке: а) A; б) В; в) С; г) D; д) М; е) N; ж) О.
( Подробнее. )
Кто решит задачу? Найдите объем прямоугольного параллелепипеда, дли на которого ширина и высота ( Подробнее. )
332.
Требуется распилить бревно на 6 частей. Каждый распил занимает 1 мин 30 с. Сколько времени потребуется на эту работу? ( Подробнее. )