fork download
  1. <?php
  2.  
  3. $bills = [
  4. 5000 => 1,
  5. 2000 => 4,
  6. 500 => 1,
  7. 200 => 3
  8. ];
  9. $sum = 6600;
  10. $result = [];
  11.  
  12. /** Возвращает массив банкнот в формате $номинал => $количество */
  13. function getBillsAndAmount($sum, $bills, &$result, $pastResult = []) {
  14.  
  15. foreach ($bills as $bill => $amount) {
  16. // Заведем временные переменные, дублирующие переданные в параметры ф-ции данные
  17. $tempSum = $sum;
  18. $tempBills = $bills;
  19. $tempResult = $pastResult;
  20.  
  21. if ($bill <= $sum && $amount > 0) {
  22. // Определим сколько нам нужно купюр данного номинала для указанной суммы
  23. $requiredAmount = floor($tempSum / $bill);
  24.  
  25. // Если купюр номинала не хватает, приравниваем нужное количество к существующему
  26. if ($requiredAmount > $amount) $requiredAmount = $amount;
  27.  
  28. // Обновим временные переменные
  29. $tempResult[$bill] = $requiredAmount;
  30. $tempBills[$bill] -= $requiredAmount;
  31. $tempSum -= $bill * $requiredAmount;
  32.  
  33. // Посчитаем сумму купюр остальных номиналов
  34. $amountOfBills = 0;
  35. foreach ($tempBills as $bill2 => $amount2) {
  36. if ($bill2 < $bill) {
  37. $amountOfBills += $bill2 * $amount2;
  38. }
  39. }
  40.  
  41. // Повторяется, пока хватает суммы остальных номиналов
  42. while ($requiredAmount > 0 && $amountOfBills >= $tempSum) {
  43. // Если есть остаток - рекурсируем функцию
  44. if ($tempSum > 0) {
  45. getBillsAndAmount($tempSum, $tempBills, $result, $tempResult);
  46. } else {
  47. $result = $tempResult;
  48. break;
  49. }
  50.  
  51. $requiredAmount--;
  52. }
  53.  
  54. }
  55.  
  56. }
  57.  
  58. }
  59.  
  60. getBillsAndAmount($sum, $bills, $result);
  61.  
  62. if ($result) {
  63. echo "Сумма: $sum\n";
  64. echo "Выдача возможна, число купюр:\n";
  65. foreach ($result as $bill => $amount) {
  66. echo "{$bill}x{$amount} ";
  67. }
  68. } else {
  69. echo "Выдача невозможна: не хватает купюр.";
  70. }
Success #stdin #stdout 0s 82560KB
stdin
Standard input is empty
stdout
Сумма: 6600
Выдача возможна, число купюр:
2000x3 200x3