Определить, можно ли расплатиться за покупку без сдачи - Free Pascal

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

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

В Волшебной стране используются монетки достоинством A1, A2,…, AM. Волшебный человечек пришел в магазин и обнаружил, что у него есть ровно по две монетки каждого достоинства. Ему нужно заплатить сумму N. Напишите программу, определяющую, сможет ли он расплатиться без сдачи. Входные данные В первой строке записано сначала число N (1 ≤ N≤ 10^9), затем число M (1 ≤ M≤ 16). Во второй строке записано M попарно различных чисел A1, A2,…, AM (1 ≤ Ai ≤ 107). Числа разделяются пробелами. Выходные данные Выведите наименьшее количество монет K, которое придется отдать Волшебному человечку, если он сможет заплатить указанную сумму без сдачи. Если без сдачи не обойтись, то выведите одно число 0. Если же у Волшебного человечка не хватит денег, чтобы заплатить указанную сумму, выведите одно число –1 (минус один). Вот мой код, но он крашится
Листинг программы
  1. var
  2. a:array[0..100] of integer;
  3. n,sum,k,min,i,j,m:integer;
  4. procedure prod;
  5. var
  6. j:integer;
  7. begin
  8. for j:=1 to 2 do begin
  9. if(i>m)then break;
  10. sum:=sum+j*a[i];
  11. inc(i);
  12. end;
  13. k:=k+j;
  14. if((sum=n))then begin
  15. min:=k;
  16. exit;
  17. end;
  18. if(sum<n)then prod;
  19. sum:=sum-j*a[i];
  20. if(sum=n)then exit;
  21. i:=i-1;
  22. k:=k-(j);
  23. end;
  24. begin
  25. readln(n,m);
  26. for i:=1 to m do begin
  27. read(a[i]);
  28. sum:=sum+2*a[i];
  29. end;
  30. if(sum<n)then begin
  31. writeln(-1);
  32. exit;
  33. end
  34. else for i:=1 to m-1 do
  35. for j:=1 to m-1 do
  36. if a[j]<a[j+1] then begin
  37. k:=a[j];
  38. a[j]:=a[j+1];
  39. a[j+1]:=k;
  40. end;
  41. sum:=0;
  42. min:=maxint;
  43. k:=0;
  44. i:=1;
  45. prod;
  46. if(min<maxint)then writeln(min)
  47. else writeln(0);
  48. readln;
  49. readln;
  50. end.
Помогите, пожалуйста

Решение задачи: «Определить, можно ли расплатиться за покупку без сдачи»

textual
Листинг программы
  1. program Coins;
  2.  
  3. type
  4.   TCoinsSet = array[1..16] of dword;
  5.  
  6.   function AmountCoins(N: dword; M: integer; const A: TCoinsSet): integer;
  7.   var
  8.     MinAmount, CurAmount: integer;
  9.     Sum: dword;
  10.  
  11.     procedure Backtracking(NCoin: integer);
  12.     var
  13.       i: integer;
  14.     begin
  15.       if NCoin > M then
  16.         Exit;
  17.       if Sum > N then
  18.         exit;
  19.  
  20.       for i := 0 to 2 do
  21.       begin
  22.         if Sum = N then
  23.         begin
  24.           if CurAmount < MinAmount then
  25.             MinAmount := CurAmount;
  26.         end;
  27.         Backtracking(NCoin + 1);
  28.         Inc(CurAmount);
  29.         Sum := Sum + A[NCoin];
  30.       end;
  31.  
  32.       Dec(CurAmount, 3);
  33.       Sum := Sum - 3 * A[NCoin];
  34.     end;
  35.  
  36.   begin
  37.     MinAmount := M + M + 1;
  38.     CurAmount := 0;
  39.     Sum := 0;
  40.     Backtracking(1);
  41.     if MinAmount > M + M then
  42.       MinAmount := 0;
  43.     AmountCoins := MinAmount;
  44.   end;
  45.  
  46. var
  47.   N: dword;
  48.   M: integer;
  49.   A: TCoinsSet;
  50.   Summ: Dword;
  51.   i: integer;
  52. begin
  53.   Summ := 0;
  54.  
  55.   readln(N, M);
  56.   for i := 1 to M do
  57.   begin
  58.     Read(A[i]);
  59.     Summ := Summ + A[i];
  60.   end;
  61.   if Summ + Summ < N then
  62.   begin
  63.     writeln('-1');
  64.   end
  65.   else
  66.   begin
  67.     writeln(AmountCoins(N, M, A));
  68.   end;
  69. end.

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

  1. Объявлены переменные:
    • N типа dword (для хранения количества монет)
    • M типа integer (для хранения количества монет для расходования)
    • A типа TCoinsSet (для хранения набора монет)
    • Summ типа dword (для хранения суммы монет)
    • i типа integer (для хранения индекса текущего элемента)
  2. Введен код для определения минимального количества монет для расходования.
  3. Введен код для чтения количества монет и номиналов монет из консоли.
  4. Вычислена общая сумма монет.
  5. Если общая сумма монет меньше заданного количества, то выводится -1.
  6. Иначе, вызывается функция AmountCoins(N, M, A), которая возвращает минимальное количество монет для расходования.
  7. И это минимальное количество монет выводится на экран.

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


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

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

11   голосов , оценка 3.909 из 5

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

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

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