<?php
header('Content-Type: text/plain; charset=UTF-8');
$amount = 1600;
5000 => 0,
2000 => 0,
1000 => 1,
500 => 100,
200 => 4,
100 => 0
);
/* Считаем количество денег в банкомате */
function getBillSum($bills)
{
$BillSum = '';
foreach ($bills as $billValue => $billAmount) {
$BillSum += $billValue * $billAmount;
}
return $BillSum;
}
/* Проверяем возможность выдачи */
function checkPaymentPossibility($amount, $bills)
{
$error = '';
$billSum = getBillSum($bills);
if ($billSum < $amount) {
$error = "в банкомате недостаточно купюр";
}
if ($amount <= 0) {
$error = "сумма должна быть больше нуля";
}
if (($amount % 100) != 0) {
$error = "сумма должна быть кратна ста";
}
return "Выдача невозможна: $error";
}
return TRUE;
}
function giveCash($amount, $bills, $billUsed=NULL, $tempResult=NULL)
{
$result = '';
$k = 0;
foreach ($bills as $billValue => $billAmount) {
if ($billValue > $amount || $billAmount == 0 || !empty($billUsed[$billValue])) { continue;
}
$billPaymentAmount = floor($amount / $billValue);
if ($billPaymentAmount == 0) {
continue;
}
if ($billPaymentAmount > $billAmount) {
$billPaymentAmount = $billAmount;
}
$amount -= $billPaymentAmount * $billValue;
$billUsed[$billValue] = TRUE;
$billKeys[] = $billValue;
$k++;
$tempResult[$billValue] = $billPaymentAmount;
}
if ($amount != 0) {
$l = $k - 1;
$tempResult[$billKeys[$l]] -= 1;
$amount += $billKeys[$l];
giveCash($amount, $bills, $billUsed, $tempResult);
}
foreach ($tempResult as $billValue => $billAmount) {
$result .= "{$billAmount}x$billValue ";
}
return $result;
}
function processATMRequest ($amount, $bills)
{
$result = '';
$errors = checkPaymentPossibility($amount, $bills);
if ($errors !== TRUE) {
return $errors;
}
$cash = giveCash($amount, $bills);
$result .= "Сумма: $amount\n";
$result .= "Выдача возможна, число купюр: $cash\n";
return $result;
}
echo processATMRequest($amount, $bills);
PD9waHAKCmhlYWRlcignQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04Jyk7CgokYW1vdW50ID0gMTYwMDsKCiRiaWxscyA9IGFycmF5KAogICAgNTAwMCAgICA9PiAwLAogICAgMjAwMCAgICA9PiAwLAogICAgMTAwMCAgICA9PiAxLAogICAgNTAwICAgICA9PiAxMDAsCiAgICAyMDAgICAgID0+IDQsCiAgICAxMDAgICAgID0+IDAKKTsKCi8qINCh0YfQuNGC0LDQtdC8INC60L7Qu9C40YfQtdGB0YLQstC+INC00LXQvdC10LMg0LIg0LHQsNC90LrQvtC80LDRgtC1ICovCmZ1bmN0aW9uIGdldEJpbGxTdW0oJGJpbGxzKQp7CiAgICAkQmlsbFN1bSA9ICcnOwoKICAgIGZvcmVhY2ggKCRiaWxscyBhcyAkYmlsbFZhbHVlID0+ICRiaWxsQW1vdW50KSB7CiAgICAgICAgJEJpbGxTdW0gKz0gJGJpbGxWYWx1ZSAqICRiaWxsQW1vdW50OwogICAgfQoKICAgIHJldHVybiAkQmlsbFN1bTsKfQoKLyog0J/RgNC+0LLQtdGA0Y/QtdC8INCy0L7Qt9C80L7QttC90L7RgdGC0Ywg0LLRi9C00LDRh9C4ICovCmZ1bmN0aW9uIGNoZWNrUGF5bWVudFBvc3NpYmlsaXR5KCRhbW91bnQsICRiaWxscykKewogICAgJGVycm9yID0gJyc7CgogICAgJGJpbGxTdW0gPSBnZXRCaWxsU3VtKCRiaWxscyk7CgogICAgaWYgKCRiaWxsU3VtIDwgJGFtb3VudCkgewogICAgICAgICRlcnJvciA9ICLQsiDQsdCw0L3QutC+0LzQsNGC0LUg0L3QtdC00L7RgdGC0LDRgtC+0YfQvdC+INC60YPQv9GO0YAiOwogICAgfQoKICAgIGlmICgkYW1vdW50IDw9IDApIHsKICAgICAgICAkZXJyb3IgPSAi0YHRg9C80LzQsCDQtNC+0LvQttC90LAg0LHRi9GC0Ywg0LHQvtC70YzRiNC1INC90YPQu9GPIjsKICAgIH0KCiAgICBpZiAoKCRhbW91bnQgJSAxMDApICE9IDApIHsKICAgICAgICAkZXJyb3IgPSAi0YHRg9C80LzQsCDQtNC+0LvQttC90LAg0LHRi9GC0Ywg0LrRgNCw0YLQvdCwINGB0YLQsCI7CiAgICB9CgogICAgaWYgKCFlbXB0eSgkZXJyb3IpKSB7CiAgICAgICAgcmV0dXJuICLQktGL0LTQsNGH0LAg0L3QtdCy0L7Qt9C80L7QttC90LA6ICRlcnJvciI7CiAgICB9CgogICAgcmV0dXJuIFRSVUU7Cn0KCmZ1bmN0aW9uIGdpdmVDYXNoKCRhbW91bnQsICRiaWxscywgJGJpbGxVc2VkPU5VTEwsICR0ZW1wUmVzdWx0PU5VTEwpCnsKICAgICRyZXN1bHQgPSAnJzsKICAgICRrID0gMDsKICAgICRiaWxsS2V5cyA9IGFycmF5KCk7CiAgICAKICAgIGZvcmVhY2ggKCRiaWxscyBhcyAkYmlsbFZhbHVlID0+ICRiaWxsQW1vdW50KSB7CiAgICAgICAgaWYgKCRiaWxsVmFsdWUgPiAkYW1vdW50IHx8ICRiaWxsQW1vdW50ID09IDAgfHwgIWVtcHR5KCRiaWxsVXNlZFskYmlsbFZhbHVlXSkpIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQoKICAgICAgICAkYmlsbFBheW1lbnRBbW91bnQgPSBmbG9vcigkYW1vdW50IC8gJGJpbGxWYWx1ZSk7CgogICAgICAgIGlmICgkYmlsbFBheW1lbnRBbW91bnQgPT0gMCkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAgIGlmICgkYmlsbFBheW1lbnRBbW91bnQgPiAkYmlsbEFtb3VudCkgewogICAgICAgICAgICAkYmlsbFBheW1lbnRBbW91bnQgPSAkYmlsbEFtb3VudDsKICAgICAgICB9CgogICAgICAgICRhbW91bnQgLT0gJGJpbGxQYXltZW50QW1vdW50ICogJGJpbGxWYWx1ZTsKCiAgICAgICAgJGJpbGxVc2VkWyRiaWxsVmFsdWVdID0gVFJVRTsKCiAgICAgICAgJGJpbGxLZXlzW10gPSAkYmlsbFZhbHVlOwogICAgICAgICRrKys7CgogICAgICAgICR0ZW1wUmVzdWx0WyRiaWxsVmFsdWVdID0gJGJpbGxQYXltZW50QW1vdW50OwogICAgfQoKICAgIGlmICgkYW1vdW50ICE9IDApIHsKICAgICAgICAkbCA9ICRrIC0gMTsKICAgICAgICAkdGVtcFJlc3VsdFskYmlsbEtleXNbJGxdXSAtPSAxOwogICAgICAgICRhbW91bnQgKz0gJGJpbGxLZXlzWyRsXTsKICAgICAgICBnaXZlQ2FzaCgkYW1vdW50LCAkYmlsbHMsICRiaWxsVXNlZCwgJHRlbXBSZXN1bHQpOwogICAgfQoKICAgIHZhcl9kdW1wKCR0ZW1wUmVzdWx0KTsKCiAgICBmb3JlYWNoICgkdGVtcFJlc3VsdCBhcyAkYmlsbFZhbHVlID0+ICRiaWxsQW1vdW50KSB7CiAgICAgICAgJHJlc3VsdCAuPSAieyRiaWxsQW1vdW50fXgkYmlsbFZhbHVlICI7CiAgICB9CgogICAgcmV0dXJuICRyZXN1bHQ7Cn0KCmZ1bmN0aW9uIHByb2Nlc3NBVE1SZXF1ZXN0ICgkYW1vdW50LCAkYmlsbHMpCnsKICAgICRyZXN1bHQgPSAnJzsKCiAgICAkZXJyb3JzID0gY2hlY2tQYXltZW50UG9zc2liaWxpdHkoJGFtb3VudCwgJGJpbGxzKTsKCiAgICBpZiAoJGVycm9ycyAhPT0gVFJVRSkgewogICAgICAgIHJldHVybiAkZXJyb3JzOwogICAgfQoKICAgICRjYXNoID0gZ2l2ZUNhc2goJGFtb3VudCwgJGJpbGxzKTsKCiAgICAkcmVzdWx0IC49ICLQodGD0LzQvNCwOiAkYW1vdW50XG4iOwogICAgJHJlc3VsdCAuPSAi0JLRi9C00LDRh9CwINCy0L7Qt9C80L7QttC90LAsINGH0LjRgdC70L4g0LrRg9C/0Y7RgDogJGNhc2hcbiI7CgogICAgcmV0dXJuICRyZXN1bHQ7Cgp9CgplY2hvIHByb2Nlc3NBVE1SZXF1ZXN0KCRhbW91bnQsICRiaWxscyk7