|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
04.06.2013, 19:26 | #1 |
Новичок
Джуниор
Регистрация: 04.06.2013
Сообщений: 4
|
Размен монет на С++
Есть неограниченный набор монет разного достоинства (количество различных достоинств задается на момент старта алгоритма). Требуется разменять заданное число N этими монетами, найти наименьшее количество монет, которые в сумме дают величину N, или указать, что задача не имеет решения.
Помогите пожалуйста, в программировании новичок, но требуется срочно сдать... Последний раз редактировалось BvaKell; 04.06.2013 в 19:35. |
04.06.2013, 21:33 | #2 | |
Старожил
Регистрация: 25.10.2011
Сообщений: 3,178
|
Цитата:
Ищите по ключевым словам "поиск в ширину", BFS. Если N не очень велико, можно создать массив из N значений и последовательно его заполнять. |
|
04.06.2013, 21:37 | #3 |
Новичок
Джуниор
Регистрация: 04.06.2013
Сообщений: 4
|
Мне подсказку дали использовать жадный алгоритм, язык программирования может быть с++, питон, с#
|
04.06.2013, 21:43 | #4 | |
Старожил
Регистрация: 25.10.2011
Сообщений: 3,178
|
Цитата:
Пусть монеты 1, 5, 7. Берём N=11. Жадный алгоритм даёт разбиение 11=7+1+1+1+1, 5 слагаемых. Оптимальное решение 11=5+5+1, 3 слагаемых. |
|
04.06.2013, 21:55 | #5 |
Старожил
Регистрация: 31.05.2010
Сообщений: 13,543
|
Это очень лёгкая задача. Если по условию, начинаем с бо'льшего и заканчиваем наименьшим.
Например - разменять 125 р 25 к. Имеются купюры (монеты): 100 р 50 р 10 р 1 р 50 к 10 к 1 к Берём наибольшее 100 р и вычитаем его из размениваемого числа. 125.25 - 100 = 25.25 Берём следующее "разменное число": 25.25 - 50 = -24.75 Результат отрицательный - отбрасываем 25.25 - (10 +10 (цикл)) = 5.25 5.25-10 = -4,75 - отбрасываем 5.25 - (1 + 5 ()в цикле) = 0.25 Ну и так далее. Предложите иной алгоритм. Есть другая задача, имеющая более практическое значение. В купюрообменнике имеются купюры разного достоинства, но их количество ограниченно и не равно. Придумать такой алгоритм, что-бы при любом, количестве вероятно обмениваемых купюр, ни одна ячейка не опустела, меньше чем на собственный номинал.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder Последний раз редактировалось Smitt&Wesson; 04.06.2013 в 21:58. |
04.06.2013, 22:22 | #6 |
Новичок
Джуниор
Регистрация: 04.06.2013
Сообщений: 4
|
Требуется разменять заданное число N этими монетами, найти наименьшее количество монет, которые в сумме дают величину N, или указать, что задача не имеет решения.
при использовании жадного, можно указать для некоторых случаев, что задача не решается...Да и с ним код попроще будет.Но проблема остается, написать мне его трудно, мне бы сам код,если не трудно... |
04.06.2013, 22:40 | #7 |
Старожил
Регистрация: 31.05.2010
Сообщений: 13,543
|
BvaKell, тук-тук-тук. Вы нас слышите? Я расписал алгоритм, а Вам, что по-башке, что по-лбу. Работаем или платим за решение. Вопросы есть?
- нет! Вы на программиста нахрена учитесь?, Что-бы студням бесплатно задачки решать? А не херово-ли будет?
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder |
04.06.2013, 23:01 | #8 | |
Старожил
Регистрация: 25.10.2011
Сообщений: 3,178
|
Цитата:
Если нам скармливают массив пар достоинств монеты и её количества, причём изначально количества заполнены нулями, а достоинства упорядочены по убыванию и завершаются нулём, такой код всегда найдёт размен, если он существует: Код:
|
|
06.06.2013, 15:56 | #9 |
Новичок
Джуниор
Регистрация: 04.06.2013
Сообщений: 4
|
Сделал код на питоне, только проблема в том. что пользователь должен сам вводить кол-во монет определенного достоинтсва, как можно сделать. чтобы оно было неограниченным?
def Razmen(sm, mas, mon): if not mas: return False for i in range(len(mas)): n = sum(mon) + mas[i] if n > sm: continue elif n < sm: mon.append(mas[i]) m = Razmen(sm, mas[i+1: ], mon) if not m: mon.pop() else: mon.append(mas[i]) return True if __name__ == "__main__": massiv=[] num = int(input('Kol-vo Dostoinstv: ')) summa = int(input('Summa: ')) n=0 while(n<num): massiv.append(int(input())) n=n+1 print (len(massiv)) massiv.sort(reverse=True) mon = [] kol=len(massiv) k=0 Razmen(summa, massiv, mon) kol=kol-len(mon) k=k+1 print ('Moneti s d-vom: ', mon) print ('Itogovaya summa: ', sum(mon)) print ("") |
Опции темы | Поиск в этой теме |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Каталог монет в Delphi | bormost2013 | Фриланс | 2 | 22.01.2013 06:40 |
Задача про подбрасывание N монет (C++) | neutral_planet | Помощь студентам | 1 | 06.12.2011 20:24 |
у Пок-ля n монет достоинством H(1)..H(n). у продавца m монет B(1)...B(l). Купить вещь стоимости S (c++) | Роза!!! | Помощь студентам | 4 | 07.05.2011 22:34 |
массы n идентичных на вид монет среди которых одна фальшивая - легче или тяжелее остальных | Wintrymoon | Паскаль, Turbo Pascal, PascalABC.NET | 14 | 10.03.2008 23:10 |