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. $suitableCombinations = [];
  20.  
  21. function generateCombinations($n, $arrayValues, $banknotes, $N)
  22. {
  23. global $money, $nominals, $suitableCombinations;
  24. if (count($arrayValues) == $n) {
  25. if (checkingCombination($arrayValues, $money, $nominals)) {
  26. $suitableCombinations[] = checkingCombination($arrayValues, $money, $nominals);
  27. }
  28. return $arrayValues;
  29. }
  30.  
  31. foreach ($banknotes[$N] as $valueOnSquare) {
  32. generateCombinations($n, array_merge($arrayValues, [$valueOnSquare]), $banknotes, $N + 1);
  33. }
  34.  
  35. }
  36.  
  37. function checkingCombination($arrayValues, $money, $nominals)
  38. {
  39. $i = 0;
  40. $sum = 0;
  41. foreach ($nominals as $nominal => $amount) {
  42. $sum += $arrayValues[$i] * $nominal; //Кол-во банкнот: {$arrayValue[$i]}. Номинал банкноты {$nominal}".
  43. $i += 1;
  44. }
  45. if ($sum == $money) {
  46. return $arrayValues;
  47. }
  48. }
  49.  
  50. generateCombinations(4, [], $banknotes, 0);
  51.  
  52. echo "Подходящие комбинации".PHP_EOL;
  53. print_r($suitableCombinations);
  54.  
  55. $bestCombination = [INF];
  56. foreach ($suitableCombinations as $combination) {
  57. if (array_sum($combination) < array_sum($bestCombination)) {
  58. $bestCombination = $combination;
  59. }
  60. }
  61. echo "Лучшая комбинация с наименьшим количеством купюр".PHP_EOL;
  62. print_r($bestCombination);
  63.  
  64. $answer = array_combine(array_keys($nominals), $bestCombination);
  65.  
  66. foreach ($answer as $nominals => $theNumberOfBills) {
  67. echo "{$theNumberOfBills}x{$nominals} ";
  68. }
  69.  
Success #stdin #stdout 0.02s 24504KB
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