fork 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, $leftAmount) {
  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. $leftAmount = $leftAmount - $currentBill*$currentMaxBills;
  41. echo "leftAmount=".$leftAmount;
  42.  
  43. //echo $amount."\n";
  44. //echo floor($amount / $keysBills[$billNumber])."\n";
  45. //echo $bills[$currentBill]."\n";
  46.  
  47. for ($i = $currentMaxBills; $i >= 0; $i--) {
  48.  
  49. $attempts++;
  50. $billsCopy = $bills;
  51. $billsCopy[$currentBill] = $i;
  52.  
  53. $sum = countBillsSum($billsCopy);
  54. echo "{$debugOffset} i=$i, billNumber=$billNumber, bills ".implode(", ", $billsCopy).", sum=$sum\n";
  55.  
  56. if ($billNumber > 0) {
  57. $x = findChange($amount, $keysBills, $billsCopy, $billNumber - 1, $leftAmount);
  58. if ($x) {
  59. return $x;
  60. }
  61. }
  62. if ($leftAmount == 0) {
  63. echo "{$debugOffset} MATCH ".implode(", ", array_values($billsCopy))." (sum=$sum)\n";
  64. $x = implode(", ", array_values($billsCopy));
  65. return $x;
  66. }
  67. }
  68. }
  69.  
  70. echo findChange($amount, $keysBills, $bills, 3, $amount);
  71. echo "\n".$attempts;
Success #stdin #stdout 0.01s 20568KB
stdin
Standard input is empty
stdout
enter 3
leftAmount=120  i=1, billNumber=3, bills 5, 0, 10, 1, sum=2550
  enter 2
leftAmount=-480    i=3, billNumber=2, bills 5, 0, 3, 1, sum=1150
    enter 1
leftAmount=-480      i=0, billNumber=1, bills 5, 0, 3, 1, sum=1150
      enter 0
leftAmount=-530        i=5, billNumber=0, bills 5, 0, 3, 1, sum=1150
        i=4, billNumber=0, bills 4, 0, 3, 1, sum=1140
        i=3, billNumber=0, bills 3, 0, 3, 1, sum=1130
        i=2, billNumber=0, bills 2, 0, 3, 1, sum=1120
        i=1, billNumber=0, bills 1, 0, 3, 1, sum=1110
        i=0, billNumber=0, bills 0, 0, 3, 1, sum=1100
    i=2, billNumber=2, bills 5, 0, 2, 1, sum=950
    enter 1
leftAmount=-480      i=0, billNumber=1, bills 5, 0, 2, 1, sum=950
      enter 0
leftAmount=-530        i=5, billNumber=0, bills 5, 0, 2, 1, sum=950
        i=4, billNumber=0, bills 4, 0, 2, 1, sum=940
        i=3, billNumber=0, bills 3, 0, 2, 1, sum=930
        i=2, billNumber=0, bills 2, 0, 2, 1, sum=920
        i=1, billNumber=0, bills 1, 0, 2, 1, sum=910
        i=0, billNumber=0, bills 0, 0, 2, 1, sum=900
    i=1, billNumber=2, bills 5, 0, 1, 1, sum=750
    enter 1
leftAmount=-480      i=0, billNumber=1, bills 5, 0, 1, 1, sum=750
      enter 0
leftAmount=-530        i=5, billNumber=0, bills 5, 0, 1, 1, sum=750
        i=4, billNumber=0, bills 4, 0, 1, 1, sum=740
        i=3, billNumber=0, bills 3, 0, 1, 1, sum=730
        i=2, billNumber=0, bills 2, 0, 1, 1, sum=720
        i=1, billNumber=0, bills 1, 0, 1, 1, sum=710
        i=0, billNumber=0, bills 0, 0, 1, 1, sum=700
    i=0, billNumber=2, bills 5, 0, 0, 1, sum=550
    enter 1
leftAmount=-480      i=0, billNumber=1, bills 5, 0, 0, 1, sum=550
      enter 0
leftAmount=-530        i=5, billNumber=0, bills 5, 0, 0, 1, sum=550
        i=4, billNumber=0, bills 4, 0, 0, 1, sum=540
        i=3, billNumber=0, bills 3, 0, 0, 1, sum=530
        i=2, billNumber=0, bills 2, 0, 0, 1, sum=520
        i=1, billNumber=0, bills 1, 0, 0, 1, sum=510
        i=0, billNumber=0, bills 0, 0, 0, 1, sum=500
  i=0, billNumber=3, bills 5, 0, 10, 0, sum=2050
  enter 2
leftAmount=-480    i=3, billNumber=2, bills 5, 0, 3, 0, sum=650
    enter 1
leftAmount=-480      i=0, billNumber=1, bills 5, 0, 3, 0, sum=650
      enter 0
leftAmount=-530        i=5, billNumber=0, bills 5, 0, 3, 0, sum=650
        i=4, billNumber=0, bills 4, 0, 3, 0, sum=640
        i=3, billNumber=0, bills 3, 0, 3, 0, sum=630
        i=2, billNumber=0, bills 2, 0, 3, 0, sum=620
        i=1, billNumber=0, bills 1, 0, 3, 0, sum=610
        i=0, billNumber=0, bills 0, 0, 3, 0, sum=600
    i=2, billNumber=2, bills 5, 0, 2, 0, sum=450
    enter 1
leftAmount=-480      i=0, billNumber=1, bills 5, 0, 2, 0, sum=450
      enter 0
leftAmount=-530        i=5, billNumber=0, bills 5, 0, 2, 0, sum=450
        i=4, billNumber=0, bills 4, 0, 2, 0, sum=440
        i=3, billNumber=0, bills 3, 0, 2, 0, sum=430
        i=2, billNumber=0, bills 2, 0, 2, 0, sum=420
        i=1, billNumber=0, bills 1, 0, 2, 0, sum=410
        i=0, billNumber=0, bills 0, 0, 2, 0, sum=400
    i=1, billNumber=2, bills 5, 0, 1, 0, sum=250
    enter 1
leftAmount=-480      i=0, billNumber=1, bills 5, 0, 1, 0, sum=250
      enter 0
leftAmount=-530        i=5, billNumber=0, bills 5, 0, 1, 0, sum=250
        i=4, billNumber=0, bills 4, 0, 1, 0, sum=240
        i=3, billNumber=0, bills 3, 0, 1, 0, sum=230
        i=2, billNumber=0, bills 2, 0, 1, 0, sum=220
        i=1, billNumber=0, bills 1, 0, 1, 0, sum=210
        i=0, billNumber=0, bills 0, 0, 1, 0, sum=200
    i=0, billNumber=2, bills 5, 0, 0, 0, sum=50
    enter 1
leftAmount=-480      i=0, billNumber=1, bills 5, 0, 0, 0, sum=50
      enter 0
leftAmount=-530        i=5, billNumber=0, bills 5, 0, 0, 0, sum=50
        i=4, billNumber=0, bills 4, 0, 0, 0, sum=40
        i=3, billNumber=0, bills 3, 0, 0, 0, sum=30
        i=2, billNumber=0, bills 2, 0, 0, 0, sum=20
        i=1, billNumber=0, bills 1, 0, 0, 0, sum=10
        i=0, billNumber=0, bills 0, 0, 0, 0, sum=0

66