fork(2) download
  1. <?php
  2.  
  3.  
  4. $amount = 620;
  5.  
  6. $bills = array(
  7. 10 => 5,
  8. 50 => 0,
  9. 200 => 10,
  10. 500 => 10,
  11. );
  12.  
  13. $keysBills = array_keys($bills);
  14.  
  15. $attempts = 0;
  16.  
  17. function countBillsSum($billsCopy) {
  18.  
  19. $valuesBillsCopy = array_values($billsCopy);
  20. $keysBillsCopy = array_keys($billsCopy);
  21.  
  22. for($i = 0; $i < count($billsCopy); $i++) {
  23. $result[$i] = $valuesBillsCopy[$i] * $keysBillsCopy[$i];
  24. }
  25. $result = array_sum($result);
  26. return $result;
  27. }
  28.  
  29. function findChange($amount, $keysBills, $bills, $billNumber, $lastAmount) {
  30.  
  31. $x = null;
  32. $debugOffset = str_repeat(" ", 3 - $billNumber);
  33. echo "{$debugOffset}enter $billNumber\n";
  34. global $attempts;
  35.  
  36. $currentBill = $keysBills[$billNumber];
  37.  
  38. if ($billNumber == 3) {
  39. echo "сработало";
  40. $lastAmount = $amount;
  41. }
  42.  
  43. $currentMaxBills = min(floor($lastAmount / $keysBills[$billNumber]), $bills[$currentBill]);
  44.  
  45. if ($billNumber !=0) {
  46. $lastAmount = $lastAmount - $currentBill*$currentMaxBills;
  47. }
  48.  
  49. for ($i = $currentMaxBills; $i >= 0; $i--) {
  50.  
  51. $attempts++;
  52. $billsCopy = $bills;
  53. $billsCopy[$currentBill] = $i;
  54. $res = $i * $currentBill;
  55.  
  56. $sum = countBillsSum($billsCopy);
  57. echo "{$debugOffset} i=$i, billNumber = $billNumber,lastAmount = $lastAmount, bills ".implode(", ", $billsCopy).", sum=$sum\n";
  58.  
  59. if ($billNumber > 0) {
  60. findChange($amount, $keysBills, $billsCopy, $billNumber - 1, $lastAmount);
  61. if ($x) {
  62. return $x;
  63. }
  64. } elseif ($res == $lastAmount) {
  65. echo "{$debugOffset} MATCH ".implode(", ", array_values($billsCopy))." (sum=$sum)\n";
  66. $x = implode(", ", array_values($billsCopy));
  67. return $x;
  68. }
  69. }
  70. }
  71.  
  72. echo findChange($amount, $keysBills, $bills, 3, $amount);
  73. echo "\n".$attempts;
Success #stdin #stdout 0.01s 20568KB
stdin
Standard input is empty
stdout
enter 3
сработало  i=1, billNumber = 3,lastAmount = 120, bills 5, 0, 10, 1, sum=2550
  enter 2
    i=0, billNumber = 2,lastAmount = 120, bills 5, 0, 0, 1, sum=550
    enter 1
      i=0, billNumber = 1,lastAmount = 120, bills 5, 0, 0, 1, sum=550
      enter 0
        i=5, billNumber = 0,lastAmount = 120, bills 5, 0, 0, 1, sum=550
        i=4, billNumber = 0,lastAmount = 120, bills 4, 0, 0, 1, sum=540
        i=3, billNumber = 0,lastAmount = 120, bills 3, 0, 0, 1, sum=530
        i=2, billNumber = 0,lastAmount = 120, bills 2, 0, 0, 1, sum=520
        i=1, billNumber = 0,lastAmount = 120, bills 1, 0, 0, 1, sum=510
        i=0, billNumber = 0,lastAmount = 120, bills 0, 0, 0, 1, sum=500
  i=0, billNumber = 3,lastAmount = 120, bills 5, 0, 10, 0, sum=2050
  enter 2
    i=0, billNumber = 2,lastAmount = 120, bills 5, 0, 0, 0, sum=50
    enter 1
      i=0, billNumber = 1,lastAmount = 120, bills 5, 0, 0, 0, sum=50
      enter 0
        i=5, billNumber = 0,lastAmount = 120, bills 5, 0, 0, 0, sum=50
        i=4, billNumber = 0,lastAmount = 120, bills 4, 0, 0, 0, sum=40
        i=3, billNumber = 0,lastAmount = 120, bills 3, 0, 0, 0, sum=30
        i=2, billNumber = 0,lastAmount = 120, bills 2, 0, 0, 0, sum=20
        i=1, billNumber = 0,lastAmount = 120, bills 1, 0, 0, 0, sum=10
        i=0, billNumber = 0,lastAmount = 120, bills 0, 0, 0, 0, sum=0

18