fork download
  1. <?php
  2.  
  3.  
  4. /* требуемая сумма */
  5. $amount = 6600;
  6. echo "Сумма: {$amount} \n";
  7.  
  8. $bills = array(
  9. 100 => 30,
  10. 500 => 10,
  11. 1000 => 1,
  12. 5000 => 20
  13. // 200 => 3,
  14. // 2000 => 4
  15. );
  16.  
  17. function payOut($amount, $bills) {
  18. //проверяем на кратность
  19. if ($amount % 100 != 0) {
  20. echo "Выдача невозможна: сумма должна быть кратной 100";
  21. }
  22.  
  23. $result = "";
  24. //сортируем массив по ключу по убыванию
  25. //для правльной работы алгоритма при добавлении номинала 200 и 2000
  26. //необходимо использовать сортировку по убыванию по значению arsort();
  27. krsort($bills);
  28. var_dump($bills);
  29.  
  30. foreach ($bills as $nominalValue => $quantity) {
  31. //находим количество купюр текущего номинала в текущем сумме
  32. $quantityMoney = floor($amount / $nominalValue);
  33. echo "Количество купюр номиналом {$nominalValue} в сумме {$amount}: {$quantityMoney} \n";
  34. echo "Количество купюр номиналом {$nominalValue} в банкомате {$quantity} \n";
  35. //если количество купюр в сумме больше чем в банкомате
  36. if ($quantityMoney > $quantity) {
  37. //присваиваем максимальное количество купюр из банкомата
  38. $quantityMoney = $quantity;
  39. }
  40. //обновляем число (новое значение = текущее значение - текущее кол-во купюр * текущий номинал)
  41. $amount -= $quantityMoney * $nominalValue;
  42. // добавляем в результат только запись со значением
  43. if ($quantity != 0) {
  44. $result = $result . " {$quantityMoney} x {$nominalValue}";
  45. }
  46.  
  47. echo "Число после выдачи всех возможных купюр номиналом {$nominalValue}: {$amount} \n";
  48. echo "\n";
  49.  
  50. // если все купюры выданы, завершаем цикл
  51. if ($amount == 0) {
  52. break;
  53. }
  54. }
  55.  
  56. // Проверяем хватает ли средств в банкомате
  57. if ($amount != 0) {
  58. echo "Выдача невозможна: недостаточно средств.";
  59. } else {
  60. echo "Выдача возможна, число купюр: \n";
  61. }
  62.  
  63. return $result;
  64. }
  65.  
  66.  
  67. echo payOut($amount, $bills);
Success #stdin #stdout 0.02s 52480KB
stdin
Standard input is empty
stdout
Сумма: 6600 
array(4) {
  [5000]=>
  int(20)
  [1000]=>
  int(1)
  [500]=>
  int(10)
  [100]=>
  int(30)
}
Количество купюр номиналом 5000 в сумме 6600: 1 
Количество купюр номиналом 5000 в банкомате 20 
Число после выдачи всех возможных купюр номиналом 5000: 1600 

Количество купюр номиналом 1000 в сумме 1600: 1 
Количество купюр номиналом 1000 в банкомате 1 
Число после выдачи всех возможных купюр номиналом 1000: 600 

Количество купюр номиналом 500 в сумме 600: 1 
Количество купюр номиналом 500 в банкомате 10 
Число после выдачи всех возможных купюр номиналом 500: 100 

Количество купюр номиналом 100 в сумме 100: 1 
Количество купюр номиналом 100 в банкомате 30 
Число после выдачи всех возможных купюр номиналом 100: 0 

Выдача возможна, число купюр: 
 1 x 5000 1 x 1000 1 x 500 1 x 100