fork download
  1. <?php
  2. //массив с доступным кол-вом купюр и массив с подсчетом выданного количества купюр
  3. $bills = array(5000 => 5, 2000 => 1, 1000 => 2, 500 => 2, 200 => 2, 100 => 1);
  4. $givenBillsCount = array(5000 => 0, 2000 => 0, 1000 => 0, 500 => 0, 200 => 0, 100 => 0);
  5.  
  6. $neededAmount = 29600; //хотим получить эту сумму
  7. $givenAmount = 0; //выданная сумма
  8.  
  9. for ($i=0; $givenAmount < $neededAmount; $i++) {
  10.  
  11. $theRest = $neededAmount - $givenAmount; //сколько осталось выдать денег
  12.  
  13. //в зависимости от выполнения условий, выберется нужная доступная купюра
  14. foreach ($bills as $value1 => $amount1) {
  15. if ($neededAmount >= $value1 && $theRest >= $value1 && $bills[$value1] != 0) {
  16. $availableBill = $value1;
  17. $givenBillsCount[$value1]++;
  18. break;
  19. }elseif ($neededAmount < $value1 || $theRest < $value1 || $bills[$value1] == 0) { //обратное первому условию
  20. 'парам пам пам ничего не делаем';
  21. } else { //в случае, если из доступных купюр не осталось ничего, а необходимая сумма все ещё не была выдана
  22. echo "Сумма: {$neededAmount}\n";
  23. echo "Выдача невозможна: в банкомате не хватает суммы ({$theRest}), попробуйте вывести сумму {$givenAmount} или меньше";
  24. break;
  25. }
  26. }
  27.  
  28. $givenAmount += $availableBill; //прибавляем нашу купюру к сумме, которую мы уже выдали
  29. $bills[$availableBill] = $bills[$availableBill] - 1; /*уменьшаем количество доступных
  30.   купюр выбранного номинала на 1*/
  31. if ($neededAmount == $givenAmount) {
  32.  
  33. echo "Выдача возможна, количество купюр:\n"; //успех
  34.  
  35. foreach ($givenBillsCount as $value2 => $amount2) {
  36.  
  37. if ($givenBillsCount[$value2] == 0) { //удаляем все не понадобившиеся купюры из массива
  38. unset($givenBillsCount[$value2]);
  39. } else {
  40. echo "{$amount2}x{$value2} "; //отображаем только те купюры, которые нам понадобились
  41. }
  42. }
  43. break;
  44. }
  45. }
  46.  
  47. ?>
Success #stdin #stdout 0.02s 24348KB
stdin
Standard input is empty
stdout
Выдача возможна, количество купюр:
5x5000 1x2000 2x1000 1x500 1x100