fork download
  1. <?php
  2.  
  3.  
  4. $amount = 6600;
  5. $bills = [5000, 2000, 500, 200];
  6. $totalBills = [1, 4, 1, 3];
  7. $rndCombination = [0, 0, 0, 0];
  8.  
  9. function nextCombination($total, $combination, $bills, $amount){
  10. $n = count($total) - 1;
  11. for( ; $n>=0; $n--){
  12. if($combination[$n] < $total[$n]){
  13. $combination[$n] += 1;
  14. break;
  15. } else {
  16. $combination[$n] = 0;
  17. }
  18. }
  19. return $combination;
  20. }
  21.  
  22. function calculateSum($combination, $bills){
  23. $sum = 0;
  24. foreach($bills as $k => $v){
  25. $sum += $v * $combination[$k];
  26. }
  27. return $sum;
  28. }
  29.  
  30. function outputCombination($combination, $bills){
  31. $str = "";
  32. foreach($bills as $k => $v){
  33. $str .= "{$v}x{$combination[$k]} ";
  34. }
  35. return $str;
  36. }
  37.  
  38. $res = nextCombination($totalBills, $rndCombination, $bills, $amount);
  39. $sum = calculateSum($res, $bills, $amount, $totalBills);
  40.  
  41. function Main($res, $sum, $amount, $totalBills, $bills){
  42. while($res != $totalBills){
  43. if($sum == $amount){
  44. $str = outputCombination($res, $bills);
  45. echo "Сумма: {$amount}\n";
  46. echo "Выдача возможна, число купюр:\n{$str}";
  47. exit();
  48. } else {
  49. $res = nextCombination($totalBills, $res, $bills, $amount);
  50. $sum = calculateSum($res, $bills, $amount, $totalBills);
  51. }
  52. }
  53. echo "Выдача невозможна, подходящей комбинации не нашлось.";
  54. }
  55.  
  56. Main($res, $sum, $amount, $totalBills, $bills);
  57.  
Success #stdin #stdout 0.02s 26628KB
stdin
Standard input is empty
stdout
Сумма: 6600
Выдача возможна, число купюр:
5000x0 2000x3 500x0 200x3