fork download
  1. <?php
  2.  
  3.  
  4. $money = 6600;
  5.  
  6. $nominals = array(
  7. 5000 => 1,
  8. 2000 => 4,
  9. 500 => 1,
  10. 200 => 3
  11. );
  12. $banknotes = array(
  13. 0 => range(0, 1),
  14. 1 => range(0, 4),
  15. 2 => range(0, 1),
  16. 3 => range(0, 3)
  17. );
  18.  
  19. function generateCombinations($n, $arrayValues, $banknotes, $N)
  20. {
  21. if (count($arrayValues) == $n) {
  22. yield $arrayValues;
  23. return $arrayValues;
  24. }
  25.  
  26. foreach ($banknotes[$N] as $valueOnSquare) {
  27. yield from generateCombinations($n, array_merge($arrayValues, [$valueOnSquare]), $banknotes, $N + 1);
  28. }
  29.  
  30. }
  31.  
  32. function checkingCombination($arrayValues, $money, $nominals)
  33. {
  34. $i = 0;
  35. $sum = 0;
  36. foreach ($nominals as $nominal => $amount) {
  37. $sum += $arrayValues[$i] * $nominal; //Кол-во банкнот: {$arrayValue[$i]}. Номинал банкноты {$nominal}".
  38. $i += 1;
  39. }
  40. if ($sum == $money) {
  41. return $arrayValues;
  42. }
  43. }
  44.  
  45.  
  46. $generator = generateCombinations(4, [], $banknotes, 0);
  47. foreach ($generator as $arrayValues) {
  48. if (checkingCombination($arrayValues, $money, $nominals)) {
  49. $suitableCombinations[] = checkingCombination($arrayValues, $money, $nominals);
  50. }
  51. }
  52.  
  53. echo "Подходящие комбинации";
  54. print_r($suitableCombinations);
  55.  
  56. $bestCombination = [INF];
  57. foreach ($suitableCombinations as $combination) {
  58. if (array_sum($combination) < array_sum($bestCombination)) {
  59. $bestCombination = $combination;
  60. }
  61. }
  62. echo "Лучшая комбинация с наименьшим количеством купюр";
  63. print_r($bestCombination);
  64.  
  65. $answer = array_combine(array_keys($nominals), $bestCombination);
  66.  
  67. foreach ($answer as $nominals => $theNumberOfBills) {
  68. echo "{$theNumberOfBills}x{$nominals} ";
  69. }
Success #stdin #stdout 0.02s 24244KB
stdin
Standard input is empty
stdout
Подходящие комбинацииArray
(
    [0] => Array
        (
            [0] => 0
            [1] => 3
            [2] => 0
            [3] => 3
        )

)
Лучшая комбинация с наименьшим количеством купюрArray
(
    [0] => 0
    [1] => 3
    [2] => 0
    [3] => 3
)
0x5000 3x2000 0x500 3x200