fork download
  1. <?php //задача банкомата
  2.  
  3.  
  4. $listOfBill = array(100,200,500,1000,2000,5000);
  5. $countOfBill = array(80,40,20,10,10,10);
  6.  
  7. $demand = 9400;
  8. $billCountLimit = 6; //максимальное количество купюр в выдаче
  9.  
  10. function calculateSumOfBill($countBill,$listOfBill){
  11. $sum = 0;
  12. for ($i=0;$i<count($listOfBill);$i++){
  13. $sum += $countBill[$i]*$listOfBill[$i];
  14. }
  15. return $sum;
  16. }
  17. function returnListOfBill($countBill,$listOfBill){
  18. $str = "";
  19. for ($i=0;$i<count($listOfBill);$i++){
  20. if ($countBill[$i]!=0){
  21. $str = $str." ".$countBill[$i]." по ".$listOfBill[$i];
  22. }
  23. }
  24. return $str;
  25. }
  26. $result = array();
  27. $resultListOfBill = array();
  28. $n = 1;
  29. $key = 0;
  30. $billCount = 0;
  31. $reason = "Недостаточно купюр!";
  32. $resultListOfBill = array(array(0,0,0,0,0,0));
  33. while ($n<1000000){
  34. $k = 0;
  35. $resultList = array();
  36. for ($j=0;$j<$n;$j++) { //Цикл по вариантам выдачи
  37. for ($i=0;$i<count($listOfBill);$i++) { //Цикл по типам купюр
  38. $resultList[$k] = $resultListOfBill[$j];
  39. if ($resultList[$k][$i]<$countOfBill[$i]){ //проверка на наличие купюры
  40. $resultList[$k][$i] += 1;
  41. $intermediateResult = calculateSumOfBill($resultList[$k],$listOfBill);
  42. if ($intermediateResult<$demand){ //Проверка суммы выдачи, если меньше трбуемого оставляем этот набор купюр
  43. $k++;
  44. }
  45. elseif($intermediateResult==$demand){ //если достаточно, завершаем поиск
  46. $result = $resultList[$k];
  47. $key = 1;
  48. break;
  49. }
  50. else{ //если больше, удаляем этот набор
  51. //echo "Номер $j удалён.\n";
  52. }
  53. }
  54. }
  55. if ($key==1){
  56. break;
  57. }
  58. }
  59. if ($key==1){
  60. break;
  61. }
  62. $billCount++;
  63. $resultListOfBill = $resultList;
  64. $n = count($resultListOfBill);
  65. if ($n<2){
  66. $reason = "Невозможно выдать нужную сумму этим набором купюр!";
  67. break;
  68. }
  69. if ($billCount>$billCountLimit){
  70. $reason = "Слишком много купюр выдавать, банкомату лень!";
  71. break;
  72. }
  73. }
  74. echo "Требуемая сумма: $demand\n";
  75. if ($key) {
  76. $a = returnListOfBill($result,$listOfBill);
  77. echo "Выдача возможна: $a \n";
  78. }
  79. else {
  80. echo "Выдача невозможна: $reason \n";
  81. }
  82.  
  83.  
Success #stdin #stdout 0.04s 52432KB
stdin
Standard input is empty
stdout
Требуемая сумма: 9400
Выдача возможна:  2 по 200 2 по 2000 1 по 5000