fork(1) download
  1. <?php
  2.  
  3.  
  4. //требуемая сумма
  5. $amount = 6600;
  6.  
  7. //запас наличных
  8. $nominals = array(100, 200, 500, 1000, 2000, 5000);
  9. $check = array();
  10. $check[0] = array(
  11. 100 => 0,
  12. 200 => 3,
  13. 500 => 1,
  14. 1000 => 0,
  15. 2000 => 4,
  16. 5000 => 1
  17. );
  18.  
  19. $tic = false;
  20. $pew = 0;
  21. $loooong = 9999;
  22. $F = array();
  23. $F = array_fill(0, $amount + 1, $loooong); // заполнение массива значением long, до 6600
  24. $F[0] = 0;
  25. for ($k = 1; $k < $amount + 1; $k++){
  26. for ($i = 0; $i < count($nominals); $i++){
  27. if ($k - $nominals[$i] >= 0 && $F[$k - $nominals[$i]] < $F[$k] && $check[$k - $nominals[$i]][$nominals[$i]] > 0){
  28. $F[$k] = $F[$k - $nominals[$i]];
  29. $check[$k] = $check[$k - $nominals[$i]]; //присвоение массиву в значении $k массива ($k - номинал банкноты)
  30. $pew = $nominals[$i];
  31. $tic = true;
  32. }
  33.  
  34. }
  35. if($tic == true){ //прибавление банкноты к истинному решению, вычитание банкноты из банкомата
  36. $check[$k][$pew] -= 1;
  37. $F[$k] += 1;
  38. $tic = false;
  39. }
  40. }
  41.  
  42. if ($F[$amount] >= 9999){
  43. echo 'выдать сумму невозможно';
  44. }
  45. else{
  46. if ($F[$amount] == 0){
  47. 'выдано ноль банкнот';
  48. }
  49. else{
  50. echo "Сумма к выдаче:{$amount}\n";
  51. echo "выдано банкнот всего: {$F[$amount]}\n";
  52. for($p = count($nominals) - 1; $p >= 0; $p--){
  53. $bankn = $check[0][$nominals[$p]] - $check[$amount][$nominals[$p]];
  54. echo "выдано {$bankn} банкнот номиналом {$nominals[$p]} рублей\n";
  55. }
  56. }
  57. }
Success #stdin #stdout 0.02s 52488KB
stdin
Standard input is empty
stdout
Сумма к выдаче:6600
выдано банкнот всего: 6
выдано 0 банкнот номиналом 5000 рублей
выдано 3 банкнот номиналом 2000 рублей
выдано 0 банкнот номиналом 1000 рублей
выдано 0 банкнот номиналом 500 рублей
выдано 3 банкнот номиналом 200 рублей
выдано 0 банкнот номиналом 100 рублей