fork(1) download
  1. <?php
  2.  
  3.  
  4. $amount = 240;
  5.  
  6. $bills = array(
  7. 10 => 10,
  8. 50 => 10,
  9. 100 => 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) {
  30.  
  31. $x = null;
  32. $debugOffset = str_repeat(" ", 3 - $billNumber);
  33. echo "{$debugOffset}enter $billNumber\n";
  34.  
  35. global $attempts;
  36.  
  37. $currentBill = $keysBills[$billNumber];
  38.  
  39. $currentMaxBills = min(floor($amount / $keysBills[$billNumber]), $bills[$currentBill]);
  40.  
  41. for ($i = $currentMaxBills; $i >= 0; $i--) {
  42.  
  43. $attempts++;
  44. $billsCopy = $bills;
  45. $billsCopy[$currentBill] = $i;
  46.  
  47. $sum = countBillsSum($billsCopy);
  48. echo "{$debugOffset} i=$i, bills ".implode(", ", $billsCopy).", sum=$sum\n";
  49.  
  50. if ($billNumber > 0) {
  51. $x = findChange($amount, $keysBills, $billsCopy, $billNumber - 1);
  52. if ($x) {
  53. return $x;
  54. }
  55. } elseif (countBillsSum($billsCopy) == $amount) {
  56. echo "{$debugOffset} MATCH ".implode(", ", array_values($billsCopy))." (sum=$sum)\n";
  57. $x = implode(", ", array_values($billsCopy));
  58. return $x;
  59. }
  60. }
  61. }
  62.  
  63. echo findChange($amount, $keysBills, $bills, 3);
  64.  
  65. //echo selectMinimumBillsArray(findChange($amount, $keysBills, $bills, 0, array()));
  66.  
  67. echo "\n".$attempts;
Success #stdin #stdout 0.01s 20568KB
stdin
Standard input is empty
stdout
enter 3
  i=0, bills 10, 10, 10, 0, sum=1600
  enter 2
    i=2, bills 10, 10, 2, 0, sum=800
    enter 1
      i=4, bills 10, 4, 2, 0, sum=500
      enter 0
        i=10, bills 10, 4, 2, 0, sum=500
        i=9, bills 9, 4, 2, 0, sum=490
        i=8, bills 8, 4, 2, 0, sum=480
        i=7, bills 7, 4, 2, 0, sum=470
        i=6, bills 6, 4, 2, 0, sum=460
        i=5, bills 5, 4, 2, 0, sum=450
        i=4, bills 4, 4, 2, 0, sum=440
        i=3, bills 3, 4, 2, 0, sum=430
        i=2, bills 2, 4, 2, 0, sum=420
        i=1, bills 1, 4, 2, 0, sum=410
        i=0, bills 0, 4, 2, 0, sum=400
      i=3, bills 10, 3, 2, 0, sum=450
      enter 0
        i=10, bills 10, 3, 2, 0, sum=450
        i=9, bills 9, 3, 2, 0, sum=440
        i=8, bills 8, 3, 2, 0, sum=430
        i=7, bills 7, 3, 2, 0, sum=420
        i=6, bills 6, 3, 2, 0, sum=410
        i=5, bills 5, 3, 2, 0, sum=400
        i=4, bills 4, 3, 2, 0, sum=390
        i=3, bills 3, 3, 2, 0, sum=380
        i=2, bills 2, 3, 2, 0, sum=370
        i=1, bills 1, 3, 2, 0, sum=360
        i=0, bills 0, 3, 2, 0, sum=350
      i=2, bills 10, 2, 2, 0, sum=400
      enter 0
        i=10, bills 10, 2, 2, 0, sum=400
        i=9, bills 9, 2, 2, 0, sum=390
        i=8, bills 8, 2, 2, 0, sum=380
        i=7, bills 7, 2, 2, 0, sum=370
        i=6, bills 6, 2, 2, 0, sum=360
        i=5, bills 5, 2, 2, 0, sum=350
        i=4, bills 4, 2, 2, 0, sum=340
        i=3, bills 3, 2, 2, 0, sum=330
        i=2, bills 2, 2, 2, 0, sum=320
        i=1, bills 1, 2, 2, 0, sum=310
        i=0, bills 0, 2, 2, 0, sum=300
      i=1, bills 10, 1, 2, 0, sum=350
      enter 0
        i=10, bills 10, 1, 2, 0, sum=350
        i=9, bills 9, 1, 2, 0, sum=340
        i=8, bills 8, 1, 2, 0, sum=330
        i=7, bills 7, 1, 2, 0, sum=320
        i=6, bills 6, 1, 2, 0, sum=310
        i=5, bills 5, 1, 2, 0, sum=300
        i=4, bills 4, 1, 2, 0, sum=290
        i=3, bills 3, 1, 2, 0, sum=280
        i=2, bills 2, 1, 2, 0, sum=270
        i=1, bills 1, 1, 2, 0, sum=260
        i=0, bills 0, 1, 2, 0, sum=250
      i=0, bills 10, 0, 2, 0, sum=300
      enter 0
        i=10, bills 10, 0, 2, 0, sum=300
        i=9, bills 9, 0, 2, 0, sum=290
        i=8, bills 8, 0, 2, 0, sum=280
        i=7, bills 7, 0, 2, 0, sum=270
        i=6, bills 6, 0, 2, 0, sum=260
        i=5, bills 5, 0, 2, 0, sum=250
        i=4, bills 4, 0, 2, 0, sum=240
        MATCH 4, 0, 2, 0 (sum=240)
4, 0, 2, 0
58