Процедура и Функция - Pascal ABC
Формулировка задачи:
Всем привет, друзья! Имеется решенная задача. Вот условие:
Даны натуральные числа а1, ..., a10. Предположим, что имеются 10 видов монет достоинством а1, ...., a10. Обозначим через bk число способов, которыми можно вы-платить сумму k, т. е. bk-это число решений уравнения a1x1 + ... + a10x10 = k, где xi, может принимать целые неотрицательные значения. Получить b0, ..., b10.
Суть в том, что мне нужно преобразовать данное решение через функцию или процедуру (лучше функцию). Помогите пожалуйста!)Решение задачи: «Процедура и Функция»
textual
Листинг программы
type vector = array [1..10] of integer; procedure work; //a[i] - достоинство i-ой монеты //b[i] - максимальное количество монет достоинством a[i], сумма которых не привышает сумму k //c[i] - текущее количество каждой монеты //q - максимальное значение монет достигло максимума //n - кол-во найденных оборотов //i,j - счетчики //s - изначальная сумма монет //k - целевая сумма var a, b, c: vector; i, j, n, s, k: integer; q: boolean; begin write('Введите сумму = '); //Ввывод на экран текста read(k); //Ввод целевой суммы write('a1 a2 ... a10 = '); //Вывод на экран достоинств монет for i := 1 to 10 do //Цикл ввода достоинств монет begin read(a[i]); //Вводим достоинсво i-ой монеты b[i] := k div a[i]; //Расчет максимального кол-ва монет, помещающихся в сумму end; repeat//Цикл перебора вариантов выплаты s := 0; //Пока что сумма равна нулю for i := 1 to 10 do s := s + a[i] * c[i]; //Цикл подсчета изначальной суммы, прибавляем к сумме достоинства текущих монет if s = k then inc(n); //Если текущая сумма достигла целевой суммы, то мы увеличиваем кол-во найденных наборов for i := 10 downto 1 do //Цикл формирования наборов, наоборот от большего к меньшему begin q := c[i] = b[i]; //Достижение максимального значения суммы текущего количество достоинств монет if q then for j := i to 10 do c[j] := 0 //Тогда обнуляем текущие количества от i-ой монеты до последней else begin//иначе(если не максимально) inc(c[i]); //Увеличиваем кол-во каждой монеты break//Досрочно выходим и цикла формирования наборов end end until q; //Если последняя монета включена в сумму максимальным количеством, прекращаем формировать наборы writeln('Число решений уравнения:', n); //Вывод количества вариантов end; begin work; end.
Объяснение кода листинга программы
- В начале кода объявляются переменные и тип данных.
- Затем происходит ввод целевой суммы и достоинств монет.
- В цикле происходит расчет максимального количества монет, которое может быть в сумме.
- Далее начинается цикл перебора вариантов выплаты.
- В этом цикле происходит подсчет изначальной суммы.
- Если изначальная сумма равна целевой, то увеличивается количество найденных наборов.
- Затем в цикле формирования наборов, начиная от большего достоинства монет к меньшему, достигается максимальное значение суммы текущего количества монет.
- Если максимальное значение достигнуто, то текущие количества монет обнуляются, начиная от i-ой монеты до последней.
- Если максимальное значение не достигнуто, то увеличивается текущее количество каждой монеты.
- Цикл формирования наборов останавливается, когда максимальное значение достигнуто.
- В конце выводится количество найденных решений уравнения.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д