fork(1) download
  1. <?php
  2.  
  3.  
  4. $bills = array (
  5. 500 => 10,
  6. 1000 => 9,
  7. 100 => 3,
  8. 5000 =>5,
  9. );
  10. $requiredSum = 16900;
  11.  
  12. echo "Сумма: $requiredSum. \n";
  13.  
  14. $cash = 0; // Здесь будем сохранять текущую сумму выдаваемых купюр;
  15.  
  16. $banknotes = array(); // Здесь все используемые купюры
  17.  
  18. $limit = 0; //всего денег в банкомате
  19.  
  20. /* Здесь сохраняем номиналы купюр, которых могло не хватить.
  21.   Это может потребоваться, а может и нет */
  22. $lackingNotes = array();
  23.  
  24. $err = "Выдача невозможна";
  25. foreach ($bills as $bill => $qty) {
  26. $limit += $bill*$qty;
  27. }
  28.  
  29. if ( $limit < $requiredSum ) {
  30. echo "$err: в банкомате не достаточно средств. \n";
  31. }
  32. if ( $requiredSum && ($requiredSum%100) ) {
  33. echo "$err: введите сумму, кратную 100, 500, 1000 или 5000. \n";
  34. }
  35. if ( $requiredSum <= 0 ) {
  36. echo "$err: минимальная сумма выдачи - 100 (сто) рублей. \n";
  37. }
  38. /*
  39. We may need to sort $bills array in order make sure
  40. that itarations will start from the biggest key. That's how
  41. we can get as many higher-value banknotes as possible and
  42. by that minimize overall amount of bills.
  43. */
  44. uksort($bills, "compareBills");
  45.  
  46. foreach ($bills as $bill => $qty) {
  47. $capacity = floor(($requiredSum - $cash)/$bill);
  48. if ( ($capacity != 0) && (($requiredSum - $cash)!= 0) && $qty != 0 ) {
  49. $amount = min($capacity, $qty);
  50. $cash += $amount * $bill;
  51. $banknotes[$bill] = $amount;
  52. if ($capacity > $qty) {
  53. $lackingNotes[] = $bill;
  54. }
  55. }
  56. }
  57.  
  58. if ($requiredSum != $cash) {
  59. $which = end($lackingNotes);
  60. echo "$err: не достаточно купюр номиналом $which. \n";
  61. }
  62. echo "Выдача возможна, число купюр:\n";
  63. foreach ($banknotes as $bill => $qty) {
  64. echo "{$qty}x{$bill} ";
  65. }
  66. echo "\n";
  67.  
  68. /*Функция для сортировки */
  69. function compareBills ($a, $b) {
  70. if ( $a==$b) {
  71. return 0;
  72. }
  73. return ($a>$b) ? -1 : 1;
  74. }
Success #stdin #stdout 0.01s 20520KB
stdin
Standard input is empty
stdout
Сумма: 16900. 
Выдача невозможна: не достаточно купюр номиналом 100.