Какой есть алгоритм вывода средств с банкомата?

Банкомат выдает купюры номиналом 1, 3, 5, 10, 25, 50, 100, 500, 1000 и 5000 рублей.
Купюр в банкомате может быть ограниченное количество.
На вход поступает сумма и нужно её выдать этими купюрами.

Например 12. Эта сумма может быть выдана как одна десятка и две единички, две пятерки и две единички, либо четыре тройки.

Я попытался реализовать прогон от большей купюры к меньшей с помощью жадного алгоритма. В итоге идеально работает при варианте, когда купюры не ограничены.
Но что делать в данной задаче не придумаю. Подскажите что-нибудь?
  • Вопрос задан
  • 11604 просмотра
Пригласить эксперта
Ответы на вопрос 3
dimonchik2013
@dimonchik2013
non progredi est regredi
разбирайся

в общем виде задача решения не имеет, кстати
Ответ написан
Комментировать
sergiks
@sergiks Куратор тега Алгоритмы
♬♬
Приоритет алгоритма – стараться выровнять кол-во остающихся купюр.

Надо посчитать разброс количеств номиналов после выдачи, и выбрать вариант, после которого этот разброс минимален среди всех вариантов. Под словом «разброс» понимать среднее квадратичное отклонение.

Когда каких-то купюр не осталось, надо показывать предупреждение, что «Банкомат выдаёт купюры достоинством X и Y», и если запрошенная сумма не составляется имеющимся набором, предлагать ближайшую больше, и ближайшую меньше, которые выдать может.
Ответ написан
@kocmoc941
C/C++ Developer
ну это же легко, например надо выдать 1100:
должна быть структурка которая содержит оставшееся количество купюр, например:
ru50 = 10,
ru100 = 2,
ru500 = 1,
ru1000 = 0,
ru5000 = 1;
далее: считаете к этой сумме от наибольшей купюры сразу с проверкой:
// псевдокод
while( NeedGiveMoneyAmount => ru50) {
if 1000 <= NeedGiveMoneyAmount AND ru1000 > 0 then
  приготовить одну 1000ю купюру
  continue;
end if;
if 500 <= NeedGiveMoneyAmount AND ru500 > 0 then
  приготовить одну 500ю купюру
  continue;
end if;
if 100 <= NeedGiveMoneyAmount AND ru100 > 0 then
  приготовить одну 100ю купюру
  continue;
end if;
if 50 <= NeedGiveMoneyAmount AND ru50 > 0 then
  приготовить одну 50ю купюру
  continue;
end if;
}

if NeedGiveMoneyAmount > 0 // осталась сдача, нужно решить что делать дальше
elif NeedGiveMoneyAmount == 0 //выдать всё что насчитали
else // ЫЫЫЫ :DD
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы