Получить все способы выплаты заданной суммы с помощью монет определенного достоинства - Turbo Pascal
Формулировка задачи:
Некоторая сумма представлена в натуральным числом N. Получить все способы выплаты этой суммы с помощью монет достоинством a1, а2, ..., am.
Решение задачи: «Получить все способы выплаты заданной суммы с помощью монет определенного достоинства»
textual
Листинг программы
program test; const M = 5; type TArray = array [1..M] of integer; procedure ShowSolve(EtSum, n: integer; const a, x: TArray); var sum, i: integer; begin sum := 0; for i := 1 to n do begin sum := sum + a[i] * x[i]; Write(a[i], '*', x[i]); if i <> n then Write('+'); end; Write('=', sum); if sum = EtSum then writeln(' - Ok') else begin writeln(' - wrong solution!'); halt; end; end; {функция решает диофантово уравнение и возвращает количество решений} function Solve(n: integer; const a: TArray; EtSum: integer): QWord; var Count: QWord; x: TArray; function f(i, sum: integer): integer; begin if sum < 0 then exit; if i = 0 then exit; if i = 1 then begin if sum mod a[1] = 0 then begin Inc(Count); x[1] := sum div a[1]; Write('Solution #', Count: 8, ' is: '); ShowSolve(EtSum, n, a, x); end; end else begin x[i] := -1; repeat Inc(x[i]); if sum - a[i] * x[i] <= 0 then break; f(i - 1, sum - a[i] * x[i]); until False; end; end; begin Count := 0; f(n, EtSum); Solve := Count; end; var DenominationCoin: TArray = (1, 2, 5, 10, 15); var sum: integer; Count: QWord; begin sum := 121; writeln; Count := Solve(M, DenominationCoin, sum); Write('There is ', Count, ' variants of a solutions.'); end.
Объяснение кода листинга программы
- Создается переменная
DenominationCoin
, которая представляет собой массив из пяти элементов, представляющих достоинство монет (1, 2, 5, 10, 15). - Создается переменная
sum
, которая представляет собой сумму, которую нужно выплатить (в данном случае 121). - Создается функция
Solve
, которая принимает в качестве параметровn
(количество монет),a
(массив с возможными значениями для каждой монеты) иEtSum
(сумма, которую нужно выплатить). Эта функция возвращает количество возможных решений. - Внутри функции
Solve
создается вспомогательная функцияf
, которая рекурсивно находит все возможные решения для каждой монеты. - В функции
f
используется рекурсия для поиска всех возможных значений для каждой монеты. Если текущая сумма меньше нуля, функция выходит из цикла. Если текущая монета - первая, проверяется, делится ли сумма на значение этой монеты без остатка. Если да, то увеличивается счетчик решений и значение этой монеты устанавливается равным найденной сумме. Затем вызывается функцияShowSolve
для вывода найденного решения. - После того, как все монеты были обработаны, функция
f
возвращает значение, которое было найдено для последней монеты. Это значение передается в функциюSolve
, которая возвращает общее количество решений. - В основной части программы создается экземпляр переменной
DenominationCoin
и присваивается значениеsum
. Затем вызывается функцияSolve
с этими значениями, и результат выводится на экран.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д