<?php
// Банкомат
// Требуемая сумма
$amount = 6600 ;
// Ответ: сумма размены "0" => "$amount", номиналы и их количество "bill" => "count"
// Номиналы банкнот, количество
) ;
$INF = 1000000 ; // Значение константы
$Results [ $i ] [ $m ] ; // Массив в котором мы храним результат
// Для всех сумм банкнотой 0 размен не ввозможен
for ( $i = 0 ; $i <= $amount ; $i ++ ) {
$Results [ 0 ] [ $i ] = $INF ; }
// Если просят разменять сумму 0, гордо протягиваем пустую ладонь.
for ( $i = 0 ; $i <= 4 ; $i ++ ) {
$Results [ $i ] [ 0 ] = 0 ;
}
// m - сумма, которую нужно выдать, увеличиваем сумму от 1 до требуемой $amount
for ( $m = 1 ; $m <= $amount ; $m ++ ) {
// Перебираем все номиналы банкнот
foreach ( $bills as $i => $value ) {
// По умолчанию, текущую сумму можно выдать банкнотой предыдущего номинала.
$Results [ $i ] [ $m ] = $Results [ $i - 1 ] [ $m ] ;
// Есть ли банкноты текущего номинала и текущую сумму можно разменять текущим номиналом
if ( $value [ 1 ] > 0 && $m >= $value [ 0 ] ) {
/* Перебераем количество банкнот текущего номинала
от минимально требуемого (или того что есть) до 1 */
/* Выбираем минимальное количество банкнот для размена между данной банкнотой и предыдущей
если сумму меняем текущей банкнотой, то записываем количество банкнот
для данного номинала и количество монет предыдущих номиналов, для размена остатка суммы */
$Results [ $i ] [ $m ] = min ( $Results [ $i ] [ $m ] , $Results [ $i - 1 ] [ $m - $l * $value [ 0 ] ] + $l ) ; }
}
}
}
// Рекурсивная Няша, считает банкноты для размены требуемой суммы для Анона
// аргументы: массив с результатом, банкноты (номинал/кол-во), кол-во номиналов, сумма для выдачи
function findAnsRecur( $Results , $bills , $i , $amount , $ans ) {
if ( $Results [ $i ] [ $amount ] == 0 ) { // финиш
printAns ( $ans ) ;
/* если для размена текущей суммы количество банкнот прошлого номинала нужно столько же,
то переходим к предыдущему номиналу */
} elseif ( $Results [ $i - 1 ] [ $amount ] == $Results [ $i ] [ $amount ] ) {
$i --;
findAnsRecur( $Results , $bills , $i , $amount , $ans ) ;
/* если текущую сумму можно несколько раз выдать текущей банкнотой, делаем это,
и добавляем текущую банкноту к результату и уменьшаем сумму выдачи на текущий номинал*/
} elseif ( $Results [ $i ] [ $amount ] >= $Results [ $i ] [ $amount - $bills [ $i ] [ 0 ] ] ) {
$ans [ $bills [ $i ] [ 0 ] ] ++;
$amount -= $bills [ $i ] [ 0 ] ;
findAnsRecur( $Results , $bills , $i , $amount , $ans ) ;
/* если остаток текущей суммы, после размена текущей банкнотой, можно выдать только
банкнотой предыдущего номинала, так тому и быть, + 1 к результату, переходим к
предыдущему номиналу и уменьшаем сумму выдачи на текущий номинал */
} else {
//$ans[] = $bills[$i][0];
$ans [ $bills [ $i ] [ 0 ] ] ++;
$i --;
$amount -= $bills [ $i ] [ 0 ] ;
findAnsRecur( $Results , $bills , $i , $amount , $ans ) ;
}
}
// Проверяем существует ли ответ для данной суммы, зовем рекурсивную Няшу или ругаемся.
function checkAns( $Results , $bills , $i , $amount , $ans ) {
if ( $Results [ $i ] [ $amount ] == $INF ) {
$ans = NULL ;
} else {
$ans = findAnsRecur( $Results , $bills , $i , $amount , $ans ) ;
}
}
// Выводим результат
function printAns ( $ans ) {
echo "Сумма: {$ans[0]} \n " ;
if ( $ans == NULL ) {
echo "Требуемую сумму выдать невозможно" ;
} else {
echo "Выдача возможна, число купюр:\n " ;
foreach ( $ans as $bill => $count ) {
if ( $bill != 0 ) {
echo "{$count} x{$bill} " . " " ;
}
}
}
}
// Запускаем проверку
checkAns
( $Results , $bills , count ( $bills ) , $amount , $ans ) ;
?>
PD9waHAKbWJfaW50ZXJuYWxfZW5jb2RpbmcoJ3V0Zi04Jyk7CgovLyDQkdCw0L3QutC+0LzQsNGCCgovLyDQotGA0LXQsdGD0LXQvNCw0Y8g0YHRg9C80LzQsAokYW1vdW50ID0gNjYwMDsKCi8vINCe0YLQstC10YI6ICDRgdGD0LzQvNCwINGA0LDQt9C80LXQvdGLICIwIiA9PiAiJGFtb3VudCIsINC90L7QvNC40L3QsNC70Ysg0Lgg0LjRhSDQutC+0LvQuNGH0LXRgdGC0LLQviAiYmlsbCIgPT4gImNvdW50IgokYW5zID0gYXJyYXkgKCRhbW91bnQpOyAKCi8vINCd0L7QvNC40L3QsNC70Ysg0LHQsNC90LrQvdC+0YIsINC60L7Qu9C40YfQtdGB0YLQstC+CiRiaWxscyA9IEFycmF5ICgKICAgICAgICAgICAgICAgIDEgPT4gQXJyYXkgKDIwMCwgMyksCiAgICAgICAgICAgICAgICAyID0+IEFycmF5ICg1MDAsIDEpLAogICAgICAgICAgICAgICAgMyA9PiBBcnJheSAoMjAwMCwgNCksCiAgICAgICAgICAgICAgICA0ID0+IEFycmF5ICg1MDAwLCAxKQopOwogCiRJTkY9MTAwMDAwMDsgICAgICAgICAgIC8vINCX0L3QsNGH0LXQvdC40LUg0LrQvtC90YHRgtCw0L3RgtGLCiRSZXN1bHRzWyRpXVskbV07ICAgICAgIC8vINCc0LDRgdGB0LjQsiDQsiDQutC+0YLQvtGA0L7QvCDQvNGLINGF0YDQsNC90LjQvCDRgNC10LfRg9C70YzRgtCw0YIKCi8vINCU0LvRjyDQstGB0LXRhSDRgdGD0LzQvCDQsdCw0L3QutC90L7RgtC+0LkgMCDRgNCw0LfQvNC10L0g0L3QtSDQstCy0L7Qt9C80L7QttC10L0KZm9yICgkaSA9IDA7ICRpPD0kYW1vdW50ICAgIDsgJGkrKykgeyAgICAKICAgICRSZXN1bHRzWzBdWyRpXSA9ICRJTkY7fQogICAgCi8vINCV0YHQu9C4INC/0YDQvtGB0Y/RgiDRgNCw0LfQvNC10L3Rj9GC0Ywg0YHRg9C80LzRgyAwLCDQs9C+0YDQtNC+INC/0YDQvtGC0Y/Qs9C40LLQsNC10Lwg0L/Rg9GB0YLRg9GOINC70LDQtNC+0L3RjC4KZm9yICgkaSA9IDA7ICRpPD00OyAkaSsrKSB7ICAgIAogICAgJFJlc3VsdHNbJGldWzBdID0gMDsKfQoKLy8gbSAtINGB0YPQvNC80LAsINC60L7RgtC+0YDRg9GOINC90YPQttC90L4g0LLRi9C00LDRgtGMLCDRg9Cy0LXQu9C40YfQuNCy0LDQtdC8INGB0YPQvNC80YMg0L7RgiAxINC00L4g0YLRgNC10LHRg9C10LzQvtC5ICRhbW91bnQKZm9yKCRtPTE7ICRtPD0kYW1vdW50OyAkbSsrKSB7CiAgICAKICAgIC8vINCf0LXRgNC10LHQuNGA0LDQtdC8INCy0YHQtSDQvdC+0LzQuNC90LDQu9GLINCx0LDQvdC60L3QvtGCCiAgICBmb3JlYWNoICgkYmlsbHMgYXMgJGkgPT4gJHZhbHVlKSB7CiAgICAgICAgCiAgICAgICAgLy8g0J/QviDRg9C80L7Qu9GH0LDQvdC40Y4sINGC0LXQutGD0YnRg9GOINGB0YPQvNC80YMg0LzQvtC20L3QviDQstGL0LTQsNGC0Ywg0LHQsNC90LrQvdC+0YLQvtC5INC/0YDQtdC00YvQtNGD0YnQtdCz0L4g0L3QvtC80LjQvdCw0LvQsC4gICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICRSZXN1bHRzWyRpXVskbV0gPSAgJFJlc3VsdHNbJGktMV1bJG1dOwogICAgICAgIAogICAgICAgIC8vINCV0YHRgtGMINC70Lgg0LHQsNC90LrQvdC+0YLRiyDRgtC10LrRg9GJ0LXQs9C+INC90L7QvNC40L3QsNC70LAg0Lgg0YLQtdC60YPRidGD0Y4g0YHRg9C80LzRgyDQvNC+0LbQvdC+INGA0LDQt9C80LXQvdGP0YLRjCDRgtC10LrRg9GJ0LjQvCDQvdC+0LzQuNC90LDQu9C+0LwgICAgICAgICAgIAogICAgICAgIGlmICgkdmFsdWVbMV0+MCAmJiAkbT49ICR2YWx1ZVswXSkgewogICAgICAgICAgICAKICAgICAgICAgICAgLyogINCf0LXRgNC10LHQtdGA0LDQtdC8INC60L7Qu9C40YfQtdGB0YLQstC+INCx0LDQvdC60L3QvtGCINGC0LXQutGD0YnQtdCz0L4g0L3QvtC80LjQvdCw0LvQsAogICAgICAgICAgICAgICAg0L7RgiDQvNC40L3QuNC80LDQu9GM0L3QviDRgtGA0LXQsdGD0LXQvNC+0LPQviAo0LjQu9C4INGC0L7Qs9C+INGH0YLQviDQtdGB0YLRjCkg0LTQviAxICovCiAgICAgICAgICAgIGZvciAoJGw9bWluKCR2YWx1ZVsxXSwgaW50dmFsKGZsb29yKCRtLyR2YWx1ZVswXSkpKTsgJGw+PTE7ICRsLS0pIHsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLyogINCS0YvQsdC40YDQsNC10Lwg0LzQuNC90LjQvNCw0LvRjNC90L7QtSDQutC+0LvQuNGH0LXRgdGC0LLQviDQsdCw0L3QutC90L7RgiDQtNC70Y8g0YDQsNC30LzQtdC90LAg0LzQtdC20LTRgyDQtNCw0L3QvdC+0Lkg0LHQsNC90LrQvdC+0YLQvtC5INC4INC/0YDQtdC00YvQtNGD0YnQtdC5CiAgICAgICAgICAgICAgICAgICAg0LXRgdC70Lgg0YHRg9C80LzRgyDQvNC10L3Rj9C10Lwg0YLQtdC60YPRidC10Lkg0LHQsNC90LrQvdC+0YLQvtC5LCDRgtC+INC30LDQv9C40YHRi9Cy0LDQtdC8INC60L7Qu9C40YfQtdGB0YLQstC+INCx0LDQvdC60L3QvtGCCiAgICAgICAgICAgICAgICAgICAg0LTQu9GPINC00LDQvdC90L7Qs9C+INC90L7QvNC40L3QsNC70LAg0Lgg0LrQvtC70LjRh9C10YHRgtCy0L4g0LzQvtC90LXRgiDQv9GA0LXQtNGL0LTRg9GJ0LjRhSDQvdC+0LzQuNC90LDQu9C+0LIsINC00LvRjyDRgNCw0LfQvNC10L3QsCDQvtGB0YLQsNGC0LrQsCDRgdGD0LzQvNGLICAqLwogICAgICAgICAgICAgICAgJFJlc3VsdHNbJGldWyRtXSA9ICBtaW4oJFJlc3VsdHNbJGldWyRtXSwgJFJlc3VsdHNbJGktMV1bJG0gLSAkbCAqICR2YWx1ZVswXV0gKyAkbCk7IAogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9ICAgCgovLyDQoNC10LrRg9GA0YHQuNCy0L3QsNGPINCd0Y/RiNCwLCDRgdGH0LjRgtCw0LXRgiDQsdCw0L3QutC90L7RgtGLINC00LvRjyDRgNCw0LfQvNC10L3RiyDRgtGA0LXQsdGD0LXQvNC+0Lkg0YHRg9C80LzRiyDQtNC70Y8g0JDQvdC+0L3QsAovLyDQsNGA0LPRg9C80LXQvdGC0Ys6INC80LDRgdGB0LjQsiDRgSDRgNC10LfRg9C70YzRgtCw0YLQvtC8LCDQsdCw0L3QutC90L7RgtGLICjQvdC+0LzQuNC90LDQuy/QutC+0Lst0LLQviksICDQutC+0Lst0LLQviDQvdC+0LzQuNC90LDQu9C+0LIsINGB0YPQvNC80LAg0LTQu9GPINCy0YvQtNCw0YfQuApmdW5jdGlvbiBmaW5kQW5zUmVjdXIoJFJlc3VsdHMsICRiaWxscywgJGksICRhbW91bnQsICRhbnMpIHsKICAgIAogICAgaWYgKCRSZXN1bHRzWyRpXVskYW1vdW50XSA9PSAwKSB7IC8vINGE0LjQvdC40YgKICAgICAgICBwcmludEFucyAoJGFucyk7CiAgICAKICAgIC8qICDQtdGB0LvQuCDQtNC70Y8g0YDQsNC30LzQtdC90LAg0YLQtdC60YPRidC10Lkg0YHRg9C80LzRiyDQutC+0LvQuNGH0LXRgdGC0LLQviDQsdCw0L3QutC90L7RgiDQv9GA0L7RiNC70L7Qs9C+INC90L7QvNC40L3QsNC70LAg0L3Rg9C20L3QviDRgdGC0L7Qu9GM0LrQviDQttC1LAogICAgICAgINGC0L4g0L/QtdGA0LXRhdC+0LTQuNC8INC6INC/0YDQtdC00YvQtNGD0YnQtdC80YMg0L3QvtC80LjQvdCw0LvRgyAqLwogICAgfSBlbHNlaWYgKCRSZXN1bHRzWyRpLTFdWyRhbW91bnRdID09ICRSZXN1bHRzWyRpXVskYW1vdW50XSkgeyAKICAgICAgICAkaS0tOwogICAgICAgIGZpbmRBbnNSZWN1cigkUmVzdWx0cywgJGJpbGxzLCAkaSwgJGFtb3VudCwgJGFucyk7CgogICAgLyogINC10YHQu9C4INGC0LXQutGD0YnRg9GOINGB0YPQvNC80YMg0LzQvtC20L3QviDQvdC10YHQutC+0LvRjNC60L4g0YDQsNC3INCy0YvQtNCw0YLRjCDRgtC10LrRg9GJ0LXQuSDQsdCw0L3QutC90L7RgtC+0LksINC00LXQu9Cw0LXQvCDRjdGC0L4sCiAgICAgICAg0Lgg0LTQvtCx0LDQstC70Y/QtdC8INGC0LXQutGD0YnRg9GOINCx0LDQvdC60L3QvtGC0YMg0Log0YDQtdC30YPQu9GM0YLQsNGC0YMg0Lgg0YPQvNC10L3RjNGI0LDQtdC8INGB0YPQvNC80YMg0LLRi9C00LDRh9C4INC90LAg0YLQtdC60YPRidC40Lkg0L3QvtC80LjQvdCw0LsqLwogICAgfSBlbHNlaWYgKCRSZXN1bHRzWyRpXVskYW1vdW50XSA+PSAkUmVzdWx0c1skaV1bJGFtb3VudC0kYmlsbHNbJGldWzBdXSkgewogICAgICAgICRhbnNbJGJpbGxzWyRpXVswXV0rKzsgCiAgICAgICAgJGFtb3VudCAtPSAkYmlsbHNbJGldWzBdOwogICAgICAgIGZpbmRBbnNSZWN1cigkUmVzdWx0cywgJGJpbGxzLCAkaSwgJGFtb3VudCwgJGFucyk7CiAgICAgCiAgICAvKiAg0LXRgdC70Lgg0L7RgdGC0LDRgtC+0Log0YLQtdC60YPRidC10Lkg0YHRg9C80LzRiywg0L/QvtGB0LvQtSDRgNCw0LfQvNC10L3QsCDRgtC10LrRg9GJ0LXQuSDQsdCw0L3QutC90L7RgtC+0LksINC80L7QttC90L4g0LLRi9C00LDRgtGMINGC0L7Qu9GM0LrQvgogICAgICAgINCx0LDQvdC60L3QvtGC0L7QuSDQv9GA0LXQtNGL0LTRg9GJ0LXQs9C+INC90L7QvNC40L3QsNC70LAsINGC0LDQuiDRgtC+0LzRgyDQuCDQsdGL0YLRjCwgKyAxINC6INGA0LXQt9GD0LvRjNGC0LDRgtGDLCDQv9C10YDQtdGF0L7QtNC40Lwg0LoKICAgICAgICDQv9GA0LXQtNGL0LTRg9GJ0LXQvNGDINC90L7QvNC40L3QsNC70YMg0Lgg0YPQvNC10L3RjNGI0LDQtdC8INGB0YPQvNC80YMg0LLRi9C00LDRh9C4INC90LAg0YLQtdC60YPRidC40Lkg0L3QvtC80LjQvdCw0LsgKi8gICAKICAgIH0gZWxzZSB7ICAKICAgICAgICAvLyRhbnNbXSA9ICRiaWxsc1skaV1bMF07CiAgICAgICAgJGFuc1skYmlsbHNbJGldWzBdXSsrOwogICAgICAgICRpLS07CiAgICAgICAgJGFtb3VudCAtPSAkYmlsbHNbJGldWzBdOyAgICAKICAgICAgICBmaW5kQW5zUmVjdXIoJFJlc3VsdHMsICRiaWxscywgJGksICRhbW91bnQsICRhbnMpOyAgCiAgICB9Cn0KLy8g0J/RgNC+0LLQtdGA0Y/QtdC8INGB0YPRidC10YHRgtCy0YPQtdGCINC70Lgg0L7RgtCy0LXRgiDQtNC70Y8g0LTQsNC90L3QvtC5INGB0YPQvNC80YssINC30L7QstC10Lwg0YDQtdC60YPRgNGB0LjQstC90YPRjiDQndGP0YjRgyDQuNC70Lgg0YDRg9Cz0LDQtdC80YHRjy4KZnVuY3Rpb24gY2hlY2tBbnMoJFJlc3VsdHMsICRiaWxscywgJGksICRhbW91bnQsICRhbnMpIHsKICAgIGlmICgkUmVzdWx0c1skaV1bJGFtb3VudF09PSRJTkYpIHsKICAgICAgICAkYW5zPU5VTEw7ICAgICAgCiAgICB9IGVsc2UgewogICAgICAgICRhbnMgPSBmaW5kQW5zUmVjdXIoJFJlc3VsdHMsICRiaWxscywgJGksICRhbW91bnQsICRhbnMpOwogICAgfQp9CgovLyDQktGL0LLQvtC00LjQvCDRgNC10LfRg9C70YzRgtCw0YIKZnVuY3Rpb24gcHJpbnRBbnMgKCRhbnMpIHsKICAgIAogICAgZWNobyAi0KHRg9C80LzQsDogeyRhbnNbMF19XG4iOwogICAgCiAgICBpZiAoJGFucz09TlVMTCkgewogICAgICAgIGVjaG8gItCi0YDQtdCx0YPQtdC80YPRjiDRgdGD0LzQvNGDINCy0YvQtNCw0YLRjCDQvdC10LLQvtC30LzQvtC20L3QviI7CiAgICB9IGVsc2UgewogICAgICAgIGVjaG8gItCS0YvQtNCw0YfQsCDQstC+0LfQvNC+0LbQvdCwLCDRh9C40YHQu9C+INC60YPQv9GO0YA6XG4iOwogICAgICAgIAogICAgICAgIGZvcmVhY2goJGFucyBhcyAkYmlsbD0+JGNvdW50KSB7CiAgICAgICAgICAgIGlmICgkYmlsbCE9MCkgewogICAgICAgICAgICAgICAgZWNobyAieyRjb3VudH14eyRiaWxsfSIgLiAiICI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCi8vINCX0LDQv9GD0YHQutCw0LXQvCDQv9GA0L7QstC10YDQutGDCmNoZWNrQW5zKCRSZXN1bHRzLCAkYmlsbHMsIGNvdW50KCRiaWxscyksICRhbW91bnQsICRhbnMpIDsKCj8+