<?php

error_reporting(-1);

/* требуемая сумма */
$amount = 54500;

$bills = array(
    100 => 23,
    500 => 5,
    1000 => 0,
    5000 => 200
);

function foo($amount, $bills) {
	$result = "";
	//переворачиваем массив, начинаем проверку с наибольшего наминала.
	$rev = array_reverse($bills, true);
	var_dump ($rev);
	foreach ($rev as $key => $value) {
		//находим количество купюр текущего наминала в текущем числе
		$countMoney = floor($amount / $key);
		echo "Количество купюр наминалом {$key} в числе {$amount}: {$countMoney} \n";
		echo "Количество купюр наминалом {$key} в банкомате {$value} \n";
		//если количество купюр в числе больше чем в банкомате
		if ($countMoney > $value){
			//присваиваем максимальное количество купюр из банкомата
			$countMoney = $value;
		}
		//обновляем число (новое значение = текущее значение -  текущее кол-во купюр * текущий наминал)
		$amount -= $countMoney * $key;
		$result = $result . " {$countMoney} x {$key}";
		echo "Число после выдаче всех возможных купюр наминалом {$key}: {$amount} \n";
		echo "\n";
	}
	
	return $result;
}

echo "Сумма {$amount} \n Выдача возможна, число купюр \n ";
echo foo($amount, $bills); 