fork download
  1. <?php
  2.  
  3. $amount = 42700;
  4. echo 'Сумма: '. $amount. "\n";
  5. $finalCount = array(); //Массив для вывода оптимального кол-ва купюр для размена
  6. $numOfBanknotes = array(); //Массив для вывода кол-ва каждого номинала купюр
  7. $finalCount[0] = 0;
  8.  
  9. $banknoteArray = array(
  10. 100 => 10,
  11. 500 => 10,
  12. 1000 => 10,
  13. 5000 => 10
  14. );
  15.  
  16. for($i = 100; $i <= $amount; $i+= 100){ //Заполняем массив $finalCount
  17. $finalCount[$i] = PHP_INT_MAX; //$i - Сумма, которую нужно выдать. Помечаю что ее пока нельзя выдать
  18. foreach($banknoteArray as $key => $value){ //Перебираю все номиналы банкнот
  19. if($key <= $i && $finalCount[$i - $key] + 100 < $finalCount[$i]){
  20. $finalCount[$i] = $finalCount[$i - $key] + 100; //Изменяю значение $finalCount[$i] если нашел лучшее решение
  21. }
  22. }
  23. }
  24. if($finalCount[$amount] == PHP_INT_MAX){
  25. echo "Данную сумму вывести невозможно\n";
  26. }else{
  27. while($amount > 0){ //Пока сумма выше нуля продолжаем прогонять массив по кругу
  28. foreach($banknoteArray as $key => $value){
  29. if($finalCount[$amount - $key] == $finalCount[$amount] - 100){ //Если для какого-то i окажется, что F(n - ai) = F(n) - 1, значит, мы можем выдать банкноту в $key рублей
  30. $numOfBanknotes[] = $key;
  31. $amount-= $key;
  32. break;
  33. }
  34. }
  35. }
  36. }
  37. $pureNumOfBanknotes = array_count_values($numOfBanknotes); //Считаем кол-во купюр каждого номинала
  38. echo "Выдача возможна, число купюр:\n";
  39. foreach($pureNumOfBanknotes as $nominal=>$repeat){
  40. echo "{$nominal}x{$repeat} ";
  41. }
Success #stdin #stdout 0.02s 52432KB
stdin
Standard input is empty
stdout
Сумма: 42700
Выдача возможна, число купюр:
100x2 500x1 1000x2 5000x8