<?php

error_reporting(-1);

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

/* Запас наличных */
$bills = array(
	100 => 23,
	500 => 5,
	1000 => 0,
	5000 => 200
	);
	
/* Считаем сколько всего разных купюр */
$billsCount = count($bills);
	
/* Ищем самую мелкую купюру */ 
reset($bills);
$firstBill = key($bills);

/* Проверяем, что требуемая сумма выше нуля */
if ($amount <= 0) {
	echo "Выдача невозможна: требуемая сумма ниже нуля, либо равна ему";
	exit();
}

/* Проверяем кратность требуемой суммы самой мелкой купюре */
if ($amount % $firstBill != 0) {
		echo "Выдача невозможна : указана сумма не кратная $firstBill";
		exit();
}

/* Переворачиваем массив, задаем значение $i и $totalAmount */
$bills = array_reverse($bills, true);
$i = 0;
$totalAmount = $amount;

/* Проверяем, хватает ли купюр */
foreach ($bills as $bill => $number) {
	$numberOfBills = floor($totalAmount / $bill);
	if ($numberOfBills > $number) {
		$numberOfBills = $number;
	}
	$totalAmount = $totalAmount - ($numberOfBills * $bill);
	$i++;
	if ($i == $billsCount && $totalAmount > 0) {
		echo "Выдача невозможна: в банкомате недостаточно купюр";
		exit();
	}
}

echo "Выдача возможна, число купюр:\n";

/* Считаем сколько количество купюр для выдачи суммы и выводим его */
foreach ($bills as $bill => $number) {
	$numberOfBills = floor($amount / $bill);
	if ($numberOfBills > $number) {
		$numberOfBills = $number;
	}
	$amount = $amount - ($numberOfBills * $bill);
	if ($numberOfBills == 0) {
		continue;
	}
	echo "$numberOfBills".'x'."$bill ";
}