<?php
header("Content-Type: text/plain; charset=utf-8");

$amount = 6600;

$notes_available = [
    100  => 0,
    200  => 3,
    500  => 1,
    2000 => 4,
    5000 => 4,
];

krsort($notes_available, SORT_NUMERIC);

$stack = array_combine(array_keys($notes_available), array_fill(0, count($notes_available), 0));

function check_withdraw($notes, $nominal, $amount, $stack)
{
    foreach($notes as $nominal => $note){

        $temp_notes = $notes;
        $temp_stack = $stack;

        $key = array_search($nominal, array_keys($temp_notes));

        @$next_nominal = array_keys($temp_notes)[$key + 1];

        $total_amount = 0;

        foreach($stack as $total_nominal => $quantity){
            $total_amount += $total_nominal*$quantity;
        }

        //если купюра есть и влезает - повторяем цикл с ней же
        if(($total_amount + $nominal < $amount) and $temp_notes[$nominal]) {

            $temp_stack[$nominal]++;
            $temp_notes[$nominal]--;
            $temp_stack = check_withdraw($temp_notes, $nominal, $amount, $temp_stack);

        //если сумма соответствует - заканчивам цикл
        }elseif(($total_amount + $nominal) == $amount and $temp_notes[$nominal]){

            $temp_stack[$nominal]++;
            $temp_notes[$nominal]--;

        //иначе пробуем добавить купюру следующего номинала по убыванию
        }elseif(isset($next_nominal) and array_sum(array_values($temp_notes))){

            unset($temp_notes[$nominal]);
            $temp_stack = check_withdraw($temp_notes, $next_nominal, $amount, $temp_stack);

        }else{
            continue;
        }

        $check_stack_amount = 0;
        foreach($temp_stack as $total_nominal => $quantity){
            $check_stack_amount += $total_nominal*$quantity;
        }
        if($check_stack_amount==$amount){
            return $temp_stack;
        }

    }
    return $temp_stack;
}

function show_result($withdraw, $amount){
    echo "Сумма $amount:\n\n";
    if(array_sum($withdraw)){

        echo "Выдача возможна, число купюр:\n\n";
        foreach($withdraw as $nominal => $quantity){
            echo $nominal."x".$quantity."\n";
        }
    }else{
        echo "Выдача невозможна.";
    }
}

show_result(check_withdraw($notes_available, false, $amount, $stack), $amount);