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

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

Пользователь вводит целое число - сумму в некоторой валюте, требуется выдать эту сумму купюрами наибольшего достоинства.
Напишите программу, которая в качестве результата скажет как именно надо разменять указанную сумму купюрами наибольшего достоинства (укажет количество для купюры каждого типа)
Например, пусть у нас набор купюр 1000, 500, 100 и 50 рублей:

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

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

-принимает на вход число (сумму) по значению

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

-массив для "количеств купюр" по ссылке

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

type inArr = array[1..4] of Integer;
var  N: integer;
    z: boolean;
    a, b: array [1..4] of integer;


procedure Razmen(N: integer; a:inArr; var b: inArr; var z: boolean);
var i: integer;
begin
  if((N mod 50) = 0) then
    begin
      for i := 1 to 4 do
        begin
          b[i] := N div a[i];
          N := N mod a[i];
          if(b[i] <> 0) then
            writeln(b[i],' kypuri po ',a[i]);
        end;
      z := true;
    end
  else
  begin
    writeln('razmen ne vozmozhen');
    z := false;
  end;
end;

begin
   write('vvedi celoe chislo - summ ');
   readln(N);
   a[1] := 1000;
   a[2] := 500;
   a[3] := 100;
   a[4] := 50;
   b[1] := 0;
   b[2] := 0;
   b[3] := 0;
   b[4] := 0;
   Razmen(N,a,b,z);
   if(z) then
     writeln('yspeh')
   else
     writeln('failed');

   readln();
end.

результат

vvedi celoe chislo - summ 1450
1 kypuri po 1000
4 kypuri po 100
1 kypuri po 50
yspeh

vedro-compota's picture

пусть набор купюр:

100 50 30

и нужно выдать:

220

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

type inArr = array[1..4] of Integer;
var  N: integer;
    z: boolean;
    a, b: array [1..4] of integer;


procedure Razmen(N: integer; a:inArr; var b: inArr; var z: boolean);
var i: integer;
begin
  if((N mod 50) <> 0) then // если число не кратно 50
    begin
      while ((N mod 50) <> 0) do // цикл по уменьшению суммы пока оно не станет кратным 50
        begin
          N:= N - 30;
          b[4]:=b[4]+1;
        end;
    end;
  if((N mod 50) = 0) then // цикл по перебору остатка кратного 50
    begin
      for i := 1 to 3 do
        begin
          b[i] := N div a[i];
          N := N mod a[i];
        end;
      z := true;
      for i := 1 to 4 do // цикл вывода купюр
        begin
          if(b[i] <> 0) then
            writeln(b[i],' kypuri po ',a[i]);
        end;
    end
  else
    begin
      writeln('razmen ne vozmozhen');
      z := false;
    end;
end;

begin
   write('vvedi celoe chislo - summ ');
   readln(N);

   a[1] := 1000;
   a[2] := 100;
   a[3] := 50;
   a[4] := 30;
   b[1] := 0;
   b[2] := 0;
   b[3] := 0;
   b[4] := 0;
   Razmen(N,a,b,z);
   if(z) then
     writeln('yspeh')
   else
     writeln('failed');

   readln();
end.
        

Результат

vvedi celoe chislo - summ 220
1 kypuri po 100
4 kypuri po 30
yspeh
vedro-compota's picture

 if((N mod 50) = 0) then

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

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

??

vedro-compota's picture

 N   M   K   G     H
 1    2   3   20   33

 0    2   1   20   33

[2, 1, 1]

9 49 0 

100 34 27 5 3

100
9%9 

4567 div 17

17

[2, 1...., 2, 0, x]

X_{n-1} * 1 + t

130
100 50 30
1 0 1

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