Получить все способы выплаты заданной суммы с помощью монет определенного достоинства - Turbo Pascal

Узнай цену своей работы

Формулировка задачи:

Некоторая сумма представлена в натуральным числом N. Получить все способы выплаты этой суммы с помощью монет достоинством a1, а2, ..., am.

Решение задачи: «Получить все способы выплаты заданной суммы с помощью монет определенного достоинства»

textual
Листинг программы
  1. program test;
  2.  
  3. const
  4.   M = 5;
  5. type
  6.   TArray = array [1..M] of integer;
  7.  
  8.   procedure ShowSolve(EtSum, n: integer; const a, x: TArray);
  9.   var
  10.     sum, i: integer;
  11.   begin
  12.     sum := 0;
  13.     for i := 1 to n do
  14.     begin
  15.       sum := sum + a[i] * x[i];
  16.       Write(a[i], '*', x[i]);
  17.       if i <> n then
  18.         Write('+');
  19.     end;
  20.     Write('=', sum);
  21.     if sum = EtSum then
  22.       writeln(' - Ok')
  23.     else
  24.     begin
  25.       writeln(' - wrong solution!');
  26.       halt;
  27.     end;
  28.   end;
  29.  
  30.   {функция решает диофантово уравнение и возвращает количество решений}
  31.   function Solve(n: integer; const a: TArray; EtSum: integer): QWord;
  32.   var
  33.     Count: QWord;
  34.     x: TArray;
  35.  
  36.     function f(i, sum: integer): integer;
  37.     begin
  38.       if sum < 0 then
  39.         exit;
  40.       if i = 0 then
  41.         exit;
  42.       if i = 1 then
  43.       begin
  44.         if sum mod a[1] = 0 then
  45.         begin
  46.           Inc(Count);
  47.           x[1] := sum div a[1];
  48.           Write('Solution #', Count: 8, ' is: ');
  49.           ShowSolve(EtSum, n, a, x);
  50.         end;
  51.       end
  52.       else
  53.       begin
  54.         x[i] := -1;
  55.         repeat
  56.           Inc(x[i]);
  57.           if sum - a[i] * x[i] <= 0 then
  58.             break;
  59.           f(i - 1, sum - a[i] * x[i]);
  60.         until False;
  61.       end;
  62.     end;
  63.  
  64.   begin
  65.     Count := 0;
  66.     f(n, EtSum);
  67.     Solve := Count;
  68.   end;
  69.  
  70. var
  71.   DenominationCoin: TArray = (1, 2, 5, 10, 15);
  72. var
  73.   sum: integer;
  74.   Count: QWord;
  75. begin
  76.   sum := 121;
  77.   writeln;
  78.   Count := Solve(M, DenominationCoin, sum);
  79.   Write('There is ', Count, ' variants of a solutions.');
  80. end.

Объяснение кода листинга программы

  1. Создается переменная DenominationCoin, которая представляет собой массив из пяти элементов, представляющих достоинство монет (1, 2, 5, 10, 15).
  2. Создается переменная sum, которая представляет собой сумму, которую нужно выплатить (в данном случае 121).
  3. Создается функция Solve, которая принимает в качестве параметров n (количество монет), a (массив с возможными значениями для каждой монеты) и EtSum (сумма, которую нужно выплатить). Эта функция возвращает количество возможных решений.
  4. Внутри функции Solve создается вспомогательная функция f, которая рекурсивно находит все возможные решения для каждой монеты.
  5. В функции f используется рекурсия для поиска всех возможных значений для каждой монеты. Если текущая сумма меньше нуля, функция выходит из цикла. Если текущая монета - первая, проверяется, делится ли сумма на значение этой монеты без остатка. Если да, то увеличивается счетчик решений и значение этой монеты устанавливается равным найденной сумме. Затем вызывается функция ShowSolve для вывода найденного решения.
  6. После того, как все монеты были обработаны, функция f возвращает значение, которое было найдено для последней монеты. Это значение передается в функцию Solve, которая возвращает общее количество решений.
  7. В основной части программы создается экземпляр переменной DenominationCoin и присваивается значение sum. Затем вызывается функция Solve с этими значениями, и результат выводится на экран.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.429 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы