<?php
function getBillsCountInMoneyAmount(int $moneyAmount, int $bill): int
{
$divisionRemain = $moneyAmount % $bill;
if ($moneyAmount === $divisionRemain) {
return 0;
}
return ($moneyAmount - $divisionRemain) / $bill;
}
function getDisposableBillsCount(int $bill, int $billsCount, array $billsInStock): int
{
$countInStock = 0;
if (array_key_exists($bill, $billsInStock)) {
$countInStock = $billsInStock[$bill];
}
return min($billsCount, $countInStock);
}
function dispenseMoney(int $requestedMoney, array $billsInStock): array
{
$remainedToDispenseMoney = $requestedMoney;
$result = [];
foreach($billsInStock as $bill => $countInStock) {
$billsCount = getBillsCountInMoneyAmount($remainedToDispenseMoney, $bill);
$disposableBillsCount = getDisposableBillsCount($bill, $billsCount, $billsInStock);
$result[$bill] = $disposableBillsCount;
$remainedToDispenseMoney -= $disposableBillsCount * $bill;
}
if (0 < $remainedToDispenseMoney) {
throw new Exception('Недостаточно купюр');
}
return $result;
}
$billsInStock = [5000 => 3, 2000 => 4, 1000 => 10, 500 => 30, 200 => 10, 100 => 30];
$requestedMoney = 11600;
var_dump(dispenseMoney($requestedMoney, $billsInStock));
- Output for 8.0.1 - 8.0.30, 8.1.0 - 8.1.33, 8.2.0 - 8.2.29, 8.3.0 - 8.3.25, 8.4.1 - 8.4.13
- array(6) {
[5000]=>
int(2)
[2000]=>
int(0)
[1000]=>
int(1)
[500]=>
int(1)
[200]=>
int(0)
[100]=>
int(1)
}
preferences:
90.06 ms | 407 KiB | 5 Q