Вывести все возможные комбинации имеющихся монет - Free Pascal
Формулировка задачи:
Пусть имеется конечный набор монет стоимостью: 10 коп., 50 коп., 1 руб., 2 руб.,
5 руб. и 10 руб. Для заданного целого числа S (обозначающего стоимость товара в
рублях) требуется вывести все возможные комбинации имеющихся монет, суммарная
стоимость которых равняется S. При этом комбинации, различающиеся только лишь
порядком следования монет одинаковой стоимости, являются тождественными и не
должны встречаться более одного раза.
Решение задачи: «Вывести все возможные комбинации имеющихся монет»
textual
Листинг программы
program test;
var
c10, c50, c100, c200, c500, c1000: longint;
S, Sum: longint;
begin
Write('S= (руб) ');
readln(S);
S := S * 100;
for c1000 := 0 to S div 1000 do
begin
Sum := c1000 * 1000;
for c500 := 0 to ((S - Sum) div 500) do
begin
Sum := Sum + c500 * 500;
for c200 := 0 to (S - Sum) div 200 do
begin
Sum := Sum + c200 * 200;
for c100 := 0 to (S - Sum) div 100 do
begin
Sum := Sum + c100 * 100;
for c50 := 0 to (S - Sum) div 50 do
begin
Sum := Sum + c50 * 50;
c10 := (S - Sum) div 10;
if Sum + c10 * 10 = S then
writeln(c1000: 4, '*10p + ', c500: 4, '*5p + ', c200: 4, '*2p + ', c100: 4,
'*1p + ', c50: 4, '*50коп + ', c10: 4, '*10коп = ', S, 'коп');
Sum := Sum - c50 * 50;
end;
Sum := Sum - c100 * 100;
end;
Sum := Sum - c200 * 200;
end;
Sum := Sum - c500 * 500;
end;
Sum := c1000 * 1000;
end;
end.
Объяснение кода листинга программы
Список действий в коде:
- Программа запрашивает у пользователя ввод количества рублей (S), которые он хочет перевести в монеты.
- Затем программа переводит S в формат длинного целого числа, умножая его на 100, чтобы получить количество центов.
- Используется цикл для перебора всех возможных комбинаций монет от 1000 центов (10 рублей) до S центов.
- Для каждой комбинации используется цикл для перебора всех возможных комбинаций монет от 500 центов (5 рублей) до (S - Sum) центов.
- Этот цикл также используется для перебора всех возможных комбинаций монет от 200 центов (2 рубля) до (S - Sum) центов.
- Аналогично, цикл используется для перебора всех возможных комбинаций монет от 100 центов (1 рубль) до (S - Sum) центов.
- Затем используется цикл для перебора всех возможных комбинаций монет от 50 центов (50 копеек) до (S - Sum) центов.
- Если (S - Sum) делится на 10 без остатка, то программа выводит текущую комбинацию монет.
- После вывода текущей комбинации, все суммы сбрасываются, и цикл продолжается со следующего номинала монет.
- Когда все комбинации монет от 1000 центов до S центов были перебраны, программа завершается.