<?php

/*Given data*/
$amount = 6600;

$bills = array(
	100 	=> 23,
	200		=> 3,
	500 	=> 1,
	1000	=> 0,
	2000 	=> 4,
	5000 	=> 1
);

/*Calculate resulting greenbacks*/
function countResult($amount, $arr) 
{
	$greenback	= array_reverse(array_keys($arr));
	$result 	= array(); 
	foreach ($greenback as $item) {
		$count	= 0;
		$res 	= 0;
		while ($count < $arr[$item] && $res <= $amount) {
			$res	+= $item; 
			$count	= $res / $item - 1;
		}
		$result[$item] = $count;	
		$amount = $amount - $item * $count;
	}
	return array_filter( $result ); # remove values equal to 0
}

/*Check for undefined possibilities*/
function checker($amount, $arr) 
{
	$availableSum = 0;
	foreach ($arr as $greenback => $count) {
		$availableSum += $greenback * $count;
	}
	$errorMsg = "";
	if ($amount < 0) {
		$errorMsg .= "сумма меньше нуля (0)";
	} elseif ($amount % 100 !== 0 ) {
		$errorMsg .= "сумма не кратна ста (100)";
	} elseif ($amount > $availableSum) {
		$errorMsg .= "в банкомате недостаточно купюр";
	} else {
		$errorMsg  = null;
	}
	return $errorMsg;
}


/*View results*/
function viewer($amount, $arr) 
{
	print "Сумма: $amount"; 
	print "\n";
	if (checker($amount, $arr) !== null) {
		print "Выдача невозможна:" . checker($amount, $arr);
		} else {
		print "Выдача возможна, число купюр:";
		print "\n";
		foreach (countResult($amount, $arr) as $key => $val) {
			print $key . "x" . $val . "\t";	
		}		
	}
}

/*Testing*/
viewer($amount, $bills);