fork(1) download
  1. <?php
  2. // Сколько выдать
  3. $input = 6600;
  4. // Номиналы и количество имеющихся купюр
  5. $bills = array(
  6. 100 => 0,
  7. 200 => 3,
  8. 500 => 1,
  9. 1000 => 0,
  10. 2000 => 4,
  11. 5000 => 1
  12. );
  13.  
  14. $error = '';
  15. if ($input < 0) {
  16. $error = 'Сумма меньше нуля';
  17. } elseif (($input % 100) != 0) {
  18. $error = 'Число не кратно 100';
  19. } else {
  20. // Упорядочить валюты по убыванию
  21. krsort($bills);
  22.  
  23. // Удаляем из массива купюры которых нет в наличии
  24. $toDelete = array_keys($bills, 0);
  25. foreach ($toDelete as $bill) {
  26. unset($bills[$bill]);
  27. }
  28.  
  29. $canIssue[0][0] = 0;
  30. $canIssue[0][1] = $bills;
  31. for ($sum = 1; $sum <= $input; ++$sum) {
  32. $canIssue[$sum][0] = INF;
  33. $canIssue[$sum][1] = $bills;
  34. $billsTmp = $bills;
  35. foreach ($billsTmp as $bill => $count) {
  36. if ($count == 0) {
  37. continue;
  38. }
  39. if (($sum >= $bill) && ($canIssue[$sum - $bill][0] + 1 < $canIssue[$sum][0])) {
  40. if ($canIssue[$sum - $bill][1][$bill] != 0) {
  41. $canIssue[$sum][0] = $canIssue[$sum - $bill][0] + 1;
  42. $billsTmp = $canIssue[$sum - $bill][1];
  43. --$billsTmp[$bill];
  44. $canIssue[$sum][1] = $billsTmp;
  45. }
  46. }
  47. }
  48. }
  49.  
  50. $sum = $input;
  51. // Количество выданных купюр
  52. $issued = array_fill_keys(array_keys($bills), 0);
  53. if ($canIssue[$sum][0] == INF) {
  54. $error = 'Недостаточно купюр';
  55. } else {
  56. while ($sum > 0) {
  57. foreach ($bills as $bill => $count) {
  58. if (isset($canIssue[$sum - $bill][0])) {
  59. if ($canIssue[$sum - $bill][0] == $canIssue[$sum][0] - 1) {
  60. ++$issued[$bill];
  61. $sum -= $bill;
  62. break;
  63. }
  64. }
  65. }
  66. }
  67. }
  68.  
  69. krsort($issued);
  70. $billsCount = '';
  71. foreach ($issued as $bill => $count) {
  72. if ($count != 0) {
  73. $billsCount .= "{$count}x{$bill} ";
  74. }
  75. }
  76. }
  77.  
  78. echo "Сумма: {$input}\n";
  79. if ($error != '') {
  80. echo "Выдача невозможна: {$error}\n";
  81. } else {
  82. echo "Выдача возможна, число купюр:\n{$billsCount}";
  83. }
Success #stdin #stdout 0.03s 20520KB
stdin
Standard input is empty
stdout
Сумма: 6600
Выдача возможна, число купюр:
3x2000 3x200