<?php
$amount = 240;
10 => 10,
50 => 10,
100 => 10,
500 => 10,
);
$attempts = 0;
function countBillsSum($billsCopy) {
for($i = 0; $i < count($billsCopy); $i++) { $result[$i] = $valuesBillsCopy[$i] * $keysBillsCopy[$i];
}
return $result;
}
function findChange($amount, $keysBills, $bills, $billNumber) {
$x = null;
//echo "{$debugOffset}enter $billNumber\n";
global $attempts;
$currentBill = $keysBills[$billNumber];
$currentMaxBills = min(floor($amount / $keysBills[$billNumber]), $bills[$currentBill]);
$amount = $amount - $currentBill*$currentMaxBills;
for ($i = $currentMaxBills; $i >= 0; $i--) {
$attempts++;
$billsCopy = $bills;
$billsCopy[$currentBill] = $i;
$sum = countBillsSum($billsCopy);
//echo "{$debugOffset} i=$i, bills ".implode(", ", $billsCopy).", sum=$sum\n";
if ($billNumber > 0) {
$x = findChange($amount, $keysBills, $billsCopy, $billNumber - 1);
if ($x) {
return $x;
}
} elseif ($amount == 0) {
//echo "{$debugOffset} MATCH ".implode(", ", array_values($billsCopy))." (sum=$sum)\n";
return $x;
}
}
}
echo findChange($amount, $keysBills, $bills, 3);
echo "\n".$attempts;
PD9waHAKCmVycm9yX3JlcG9ydGluZygtMSk7CgokYW1vdW50ID0gMjQwOwoKJGJpbGxzID0gYXJyYXkoCgkxMCA9PiAxMCwKCTUwID0+IDEwLAoJMTAwID0+IDEwLAoJNTAwID0+IDEwLAopOwoKJGtleXNCaWxscyA9IGFycmF5X2tleXMoJGJpbGxzKTsKCiRhdHRlbXB0cyA9IDA7CgpmdW5jdGlvbiBjb3VudEJpbGxzU3VtKCRiaWxsc0NvcHkpIHsKCQoJJHZhbHVlc0JpbGxzQ29weSA9IGFycmF5X3ZhbHVlcygkYmlsbHNDb3B5KTsKCSRrZXlzQmlsbHNDb3B5ID0gYXJyYXlfa2V5cygkYmlsbHNDb3B5KTsKCQoJZm9yKCRpID0gMDsgJGkgPCBjb3VudCgkYmlsbHNDb3B5KTsgJGkrKykgewoJCSRyZXN1bHRbJGldID0gJHZhbHVlc0JpbGxzQ29weVskaV0gKiAka2V5c0JpbGxzQ29weVskaV07Cgl9CQoJJHJlc3VsdCA9IGFycmF5X3N1bSgkcmVzdWx0KTsKCXJldHVybiAkcmVzdWx0OwkKfQkKCmZ1bmN0aW9uIGZpbmRDaGFuZ2UoJGFtb3VudCwgJGtleXNCaWxscywgJGJpbGxzLCAkYmlsbE51bWJlcikgewoJCgkkeCA9IG51bGw7CgkkZGVidWdPZmZzZXQgPSBzdHJfcmVwZWF0KCIgICIsIDMgLSAkYmlsbE51bWJlcik7CgkvL2VjaG8gInskZGVidWdPZmZzZXR9ZW50ZXIgJGJpbGxOdW1iZXJcbiI7CgkKCWdsb2JhbCAkYXR0ZW1wdHM7CgkKCSRjdXJyZW50QmlsbCA9ICRrZXlzQmlsbHNbJGJpbGxOdW1iZXJdOwoJCgkkY3VycmVudE1heEJpbGxzID0gbWluKGZsb29yKCRhbW91bnQgLyAka2V5c0JpbGxzWyRiaWxsTnVtYmVyXSksICRiaWxsc1skY3VycmVudEJpbGxdKTsKCgkkYW1vdW50ID0gJGFtb3VudCAtICRjdXJyZW50QmlsbCokY3VycmVudE1heEJpbGxzOwoJCglmb3IgKCRpID0gJGN1cnJlbnRNYXhCaWxsczsgJGkgPj0gMDsgJGktLSkgewoJCgkJJGF0dGVtcHRzKys7CgkJJGJpbGxzQ29weSA9ICRiaWxsczsKCQkkYmlsbHNDb3B5WyRjdXJyZW50QmlsbF0gPSAkaTsKCQkKCQkkc3VtID0gY291bnRCaWxsc1N1bSgkYmlsbHNDb3B5KTsKCQkvL2VjaG8gInskZGVidWdPZmZzZXR9ICBpPSRpLCBiaWxscyAiLmltcGxvZGUoIiwgIiwgJGJpbGxzQ29weSkuIiwgc3VtPSRzdW1cbiI7CgkJCgkJaWYgKCRiaWxsTnVtYmVyID4gMCkgeyAKCQkJJHggPSBmaW5kQ2hhbmdlKCRhbW91bnQsICRrZXlzQmlsbHMsICRiaWxsc0NvcHksICRiaWxsTnVtYmVyIC0gMSk7CgkJCWlmICgkeCkgewoJCQkJcmV0dXJuICR4OwoJCQl9CgkJfSBlbHNlaWYgKCRhbW91bnQgPT0gMCkgewoJCQkvL2VjaG8gInskZGVidWdPZmZzZXR9ICBNQVRDSCAiLmltcGxvZGUoIiwgIiwgYXJyYXlfdmFsdWVzKCRiaWxsc0NvcHkpKS4iIChzdW09JHN1bSlcbiI7CgkJCSR4ID0gaW1wbG9kZSgiLCAiLCBhcnJheV92YWx1ZXMoJGJpbGxzQ29weSkpOwoJCQlyZXR1cm4gJHg7CgkJfSAKCX0KfQoKZWNobyBmaW5kQ2hhbmdlKCRhbW91bnQsICRrZXlzQmlsbHMsICRiaWxscywgMyk7CmVjaG8gIlxuIi4kYXR0ZW1wdHM7