Другие языки программирования и технологии

Олимпиадная задача по паскалю

Задание: вводим с клавиатуры целое число N.В некой стране используются купюры в 1,5,10,20,50,100,200,500,1000 чего-то там. Нужно, чтобы на экран выводилось минимальное кол-во требуемых купюр для получения суммы N.

Помогите пожалуйста, а то что-то не доходит до меня. И просьба писать только нормальные ответы, а не по типу: "Погугли","Иди учиться","Я этого не знаю" и всё в таком духе.
Напишите номиналы купюр посложнее, а то вариант выше правильно работает.
И тогда появится нормальная рекурсия и нормальная "олимпиадная" сложность задачи (по крайней мере, для районной олимпиады) .

А если еще ограничения на вычислительную сложность алгоритма добавить - тогда, может, и не только для районной олимпиады задачка подойдет, тут уже не вдумывался.

PS. Для более сложных номиналов (бещ ограничений на выч. сложность алгоритма) эта задачка, если не ошибаюсь, называется в школе задачей динамического программирования. Впрочем, сводится всё равно к достаточно простой рекурсии. Просто рекурсия - еще та "штучка", пока руку не набьёте, она очень страшно выглядит, а потом - очень просто.

PPS. "Это олимпиадная задача для 9-10 класса. "

Именно с этими номиналами купюр она является олимпиадной? С такими номиналами достаточно просто на каждом шаге вычитать из суммы самый большой номинал, не превышающий сумму. Потому что номиналы так подобраны. Давайте ее усложним, добавим номинал в 400 тугриков, и тогда вариант выше не будет работать для суммы в 800 тугриков. А еще лучше - сделаем их произвольными натуральными, чтобы читались из файла
Павел Борисенко
Павел Борисенко
19 662
Лучший ответ
Какая-то примитивная слишком задача для олимпиады.

const
nominals : array[9] of integer = (1,5,10,20,50,100,200,500,1000);
var i, n, k:integer;
begin
k:=0;
readln(n);
for i:=High(nominals ) downto Low(nominals) do
begin
k:=k+n div nominals[i];
n:=n mod nominals[i];
end;
writeln(k);
end.
@big86 Тг
@big86 Тг
89 195