Процедура и Функция - 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.

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

  1. В начале кода объявляются переменные и тип данных.
  2. Затем происходит ввод целевой суммы и достоинств монет.
  3. В цикле происходит расчет максимального количества монет, которое может быть в сумме.
  4. Далее начинается цикл перебора вариантов выплаты.
  5. В этом цикле происходит подсчет изначальной суммы.
  6. Если изначальная сумма равна целевой, то увеличивается количество найденных наборов.
  7. Затем в цикле формирования наборов, начиная от большего достоинства монет к меньшему, достигается максимальное значение суммы текущего количества монет.
  8. Если максимальное значение достигнуто, то текущие количества монет обнуляются, начиная от i-ой монеты до последней.
  9. Если максимальное значение не достигнуто, то увеличивается текущее количество каждой монеты.
  10. Цикл формирования наборов останавливается, когда максимальное значение достигнуто.
  11. В конце выводится количество найденных решений уравнения.

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


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

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

15   голосов , оценка 3.733 из 5
Похожие ответы