Урок 15 Задача 22

Урок 15 Задача 22

Задача про банкомат:

Пользователь вводит целое число - сумму в некоторой валюте, требуется выдать эту сумму купюрами наибольшего достоинства.

Напишите программу, которая в качестве результата скажет как именно надо разменять указанную сумму купюрами наибольшего достоинства (укажет количество для купюры каждого типа)

Например, пусть у нас набор купюр 1000, 500, 100 и 50 рублей:

Сумму 350 рублей: по задаче следует выдать как: 3 по 100 и 1 по 50
Сумму 520 рублей: таким набором разменять нельзя.

Указания по возможному оформлению (можно оформлять и иначе):

Напишите процедуру, которая:

принимает на вход число (сумму) по значению
массив "достоинств" купюр отсортированный по убыванию (предположим, что видов купюр не может быть больше 10) по значению
массив для "количеств купюр" по ссылке
булевский параметр успешности подбора купюр (некоторые суммы вообще разменять нельзя)

После выполнения процедуры в четвертом параметре должен быть true или false, а в массиве "количеств" должены находится находится значения, на основании которых банкомант мог бы выдать купюры.

Решение:

program u15z22;
type newArr = array[1..5] of integer;
var sum,i:integer;
  denom,qtyCash:newArr;
  s:boolean;

procedure outputCash(sum:integer; denom:newArr; var qtyCash:newArr; var s:boolean);
var i:integer;
begin
  s:=true;
  if sum mod denom[5] > 0 then
  begin
    writeln('no cash');
    s:=false;
  end;
  while (sum>0) do
  begin
    for i:=low(denom) to high(denom) do
    begin
      if ((sum div denom[i])>0) then
      begin
        qtyCash[i]:=sum div denom[i];
        sum:=sum - qtyCash[i]*denom[i];
      end;
    end;
  end;
end;

begin
  denom[1]:=5000;
  denom[2]:=2000;
  denom[3]:=1000;
  denom[4]:=500;
  denom[5]:=100;
  writeln('vvedite summu:');
  readln(sum);
  outputCash(sum,denom,qtyCash,s);
  if s=true then
  begin
    writeln(s);
    writeln('Kolichestvo vydannykh kupyur:');
    for i:=low(denom) to high(denom) do
      writeln(denom[i],' - ',qtyCash[i]);
  end
  else
    writeln(s);
  readln();
end.

Консоль:

vvedite summu:
8800
TRUE
Kolichestvo vydannykh kupyur:
5000 - 1
2000 - 1
1000 - 1
500 - 1
100 - 3
vedro-compota's picture

попробовать решить для произвольного набора купюр, напр:

137  43   17  3

И напр. надо выдать сумму 12457 рублей, или любую другую

_____________
матфак вгу и остальная классика =)

Решение:

program u15z22;
type newArr = array[1..4] of integer;
var sum,i:integer;
  denom,qtyCash:newArr;
  s:boolean;

procedure outputCash(sum:integer; denom:newArr; var qtyCash:newArr; var s:boolean);
var i:integer;
begin
  s:=true;
  if sum mod denom[4] > 0 then
  begin
    writeln('no cash');
    s:=false;
  end;
  while (sum>0) do
  begin
    for i:=low(denom) to high(denom) do
    begin
      if ((sum div denom[i])>0) then
      begin
        qtyCash[i]:=sum div denom[i];
        sum:=sum - qtyCash[i]*denom[i];
      end;
    end;
  end;
end;

begin
  denom[1]:=137;
  denom[2]:=43;
  denom[3]:=17;
  denom[4]:=3;
//  denom[5]:=1;
  writeln('vvedite summu:');
  readln(sum);
  outputCash(sum,denom,qtyCash,s);
  if s=true then
  begin
    writeln(s);
    writeln('Kolichestvo vydannykh kupyur:');
    for i:=low(denom) to high(denom) do
      writeln(denom[i],' - ',qtyCash[i]);
  end
  else
    writeln(s);
  readln();
end.

Консоль:

vvedite summu:
12456
TRUE
Kolichestvo vydannykh kupyur:
137 - 90
43 - 2
17 - 2
3 - 2

vvedite summu:
12457
no cash
vedro-compota's picture

засчитано

_____________
матфак вгу и остальная классика =)