fork(6) download
  1. <?php
  2.  
  3.  
  4. /* Требуемая сумма */
  5. $amount = 54500;
  6.  
  7. /* Запас наличных */
  8. $bills = array(
  9. 100 => 23,
  10. 500 => 5,
  11. 1000 => 0,
  12. 5000 => 200
  13. );
  14.  
  15. /* Считаем сколько всего разных купюр */
  16. $billsCount = count($bills);
  17.  
  18. /* Ищем самую мелкую купюру */
  19. reset($bills);
  20. $firstBill = key($bills);
  21.  
  22. /* Проверяем, что требуемая сумма выше нуля */
  23. if ($amount <= 0) {
  24. echo "Выдача невозможна: требуемая сумма ниже нуля, либо равна ему";
  25. exit();
  26. }
  27.  
  28. /* Проверяем кратность требуемой суммы самой мелкой купюре */
  29. if ($amount % $firstBill != 0) {
  30. echo "Выдача невозможна : указана сумма не кратная $firstBill";
  31. exit();
  32. }
  33.  
  34. /* Переворачиваем массив, задаем значение $i и $totalAmount */
  35. $bills = array_reverse($bills, true);
  36. $i = 0;
  37. $totalAmount = $amount;
  38.  
  39. /* Проверяем, хватает ли купюр */
  40. foreach ($bills as $bill => $number) {
  41. $numberOfBills = floor($totalAmount / $bill);
  42. if ($numberOfBills > $number) {
  43. $numberOfBills = $number;
  44. }
  45. $totalAmount = $totalAmount - ($numberOfBills * $bill);
  46. $i++;
  47. if ($i == $billsCount && $totalAmount > 0) {
  48. echo "Выдача невозможна: в банкомате недостаточно купюр";
  49. exit();
  50. }
  51. }
  52.  
  53. echo "Выдача возможна, число купюр:\n";
  54.  
  55. /* Считаем сколько количество купюр для выдачи суммы и выводим его */
  56. foreach ($bills as $bill => $number) {
  57. $numberOfBills = floor($amount / $bill);
  58. if ($numberOfBills > $number) {
  59. $numberOfBills = $number;
  60. }
  61. $amount = $amount - ($numberOfBills * $bill);
  62. if ($numberOfBills == 0) {
  63. continue;
  64. }
  65. echo "$numberOfBills".'x'."$bill ";
  66. }
Success #stdin #stdout 0.01s 24400KB
stdin
Standard input is empty
stdout
Выдача возможна, число купюр:
10x5000 5x500 20x100