<?php
//Сколько выдать
$input = 6600;
//Номиналы и количество имеющихся купюр
$bills = array(
    100 => 0,
    200 => 3,
    500 => 1,
    1000 => 0,
    2000 => 4,
    5000 => 1
);
//Упорядочить валюты по убыванию
krsort($bills);
//Количество выданных купюр
$issued = array_fill_keys(array_flip($bills), 0);
//Удаляем из массива купюры которых нет в наличии
$toDelete = array_keys($bills, 0);
foreach ($toDelete as $bill) {
    unset($bills[$bill]);
}

$tmp = '';
$canIssue[0][0] = 0;
$canIssue[0][1] = $bills;
for ($sum = 1; $sum <= $input; ++$sum) {
    $canIssue[$sum][0] = INF;
    $billsTmp = $bills;
    foreach ($billsTmp as $bill => $count) {
        if ($count == 0) {
            continue;
        }
        if (($sum >= $bill) && ($canIssue[$sum - $bill][0] + 1 < $canIssue[$sum][0])) {
            if ($canIssue[$sum - $bill][1][$bill] != 0) {
                $canIssue[$sum][0] = $canIssue[$sum - $bill][0] + 1;
                $billsTmp[$bill] = $canIssue[$sum - $bill][1][$bill];
                --$billsTmp[$bill];
            }
        }
    }
    $canIssue[$sum][1] = $billsTmp;
}

if ($canIssue[$input][0] == INF) {
    echo "Выдача невозможна";
} else {
    while ($input > 0) {
        foreach ($bills as $bill => $count) {
            if (isset($canIssue[$input -$bill][0])) {
                if ($canIssue[$input - $bill][0] == $canIssue[$input][0] - 1) {
                    $tmp .= $bill . ' ';
                    $input -= $bill;
                    break;
                }
            }
        }
    }
}
print_r($tmp);