<?php

$bills = [
	5000 => 1,
	2000 => 4,
	500 => 1,
	200 => 3
];
$sum = 6600;
$result = [];

/** Возвращает массив банкнот в формате $номинал => $количество */
function getBillsAndAmount($sum, $bills, &$result, $pastResult = []) {
	
	foreach ($bills as $bill => $amount) {
		// Заведем временные переменные, дублирующие переданные в параметры ф-ции данные
		$tempSum = $sum;
		$tempBills = $bills;
		$tempResult = $pastResult;
		
		if ($bill <= $sum && $amount > 0) {
			// Определим сколько нам нужно купюр данного номинала для указанной суммы
			$requiredAmount = floor($tempSum / $bill);
			
			// Если купюр номинала не хватает, приравниваем нужное количество к существующему
			if ($requiredAmount > $amount) $requiredAmount = $amount;
			
			// Обновим временные переменные
			$tempResult[$bill] = $requiredAmount;
			$tempBills[$bill] -= $requiredAmount;
			$tempSum -= $bill * $requiredAmount;
			
			// Посчитаем сумму купюр остальных номиналов
			$amountOfBills = 0;
			foreach ($tempBills as $bill2 => $amount2) {
				if ($bill2 < $bill) {
	            	$amountOfBills += $bill2 * $amount2;
	        	}
			}
			
			// Повторяется, пока хватает суммы остальных номиналов
			while ($requiredAmount > 0 && $amountOfBills >= $tempSum) {
				// Если есть остаток - рекурсируем функцию
				if ($tempSum > 0) {
					getBillsAndAmount($tempSum, $tempBills, $result, $tempResult);
				} else {
					$result = $tempResult;
					break;
				}
				
				$requiredAmount--;
			}
			
		}
		
	}
	
}

getBillsAndAmount($sum, $bills, $result);

if ($result) {
	echo "Сумма: $sum\n";
	echo "Выдача возможна, число купюр:\n";
	foreach ($result as $bill => $amount) {
		echo "{$bill}x{$amount} ";
	}
} else {
	echo "Выдача невозможна: не хватает купюр.";
}