<?php
$amount = 620;
10 => 5,
50 => 0,
200 => 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;
PD9waHAKCmVycm9yX3JlcG9ydGluZygtMSk7CgokYW1vdW50ID0gNjIwOwoKJGJpbGxzID0gYXJyYXkoCgkxMCA9PiA1LAoJNTAgPT4gMCwKCTIwMCA9PiAxMCwKCTUwMCA9PiAxMCwKKTsKCiRrZXlzQmlsbHMgPSBhcnJheV9rZXlzKCRiaWxscyk7CgokYXR0ZW1wdHMgPSAwOwoKZnVuY3Rpb24gY291bnRCaWxsc1N1bSgkYmlsbHNDb3B5KSB7CgkKCSR2YWx1ZXNCaWxsc0NvcHkgPSBhcnJheV92YWx1ZXMoJGJpbGxzQ29weSk7Cgkka2V5c0JpbGxzQ29weSA9IGFycmF5X2tleXMoJGJpbGxzQ29weSk7CgkKCWZvcigkaSA9IDA7ICRpIDwgY291bnQoJGJpbGxzQ29weSk7ICRpKyspIHsKCQkkcmVzdWx0WyRpXSA9ICR2YWx1ZXNCaWxsc0NvcHlbJGldICogJGtleXNCaWxsc0NvcHlbJGldOwoJfQkKCSRyZXN1bHQgPSBhcnJheV9zdW0oJHJlc3VsdCk7CglyZXR1cm4gJHJlc3VsdDsJCn0JCgpmdW5jdGlvbiBmaW5kQ2hhbmdlKCRhbW91bnQsICRrZXlzQmlsbHMsICRiaWxscywgJGJpbGxOdW1iZXIpIHsKCQoJJHggPSBudWxsOwoJJGRlYnVnT2Zmc2V0ID0gc3RyX3JlcGVhdCgiICAiLCAzIC0gJGJpbGxOdW1iZXIpOwoJLy9lY2hvICJ7JGRlYnVnT2Zmc2V0fWVudGVyICRiaWxsTnVtYmVyXG4iOwoJCglnbG9iYWwgJGF0dGVtcHRzOwoJCgkkY3VycmVudEJpbGwgPSAka2V5c0JpbGxzWyRiaWxsTnVtYmVyXTsKCQoJJGN1cnJlbnRNYXhCaWxscyA9IG1pbihmbG9vcigkYW1vdW50IC8gJGtleXNCaWxsc1skYmlsbE51bWJlcl0pLCAkYmlsbHNbJGN1cnJlbnRCaWxsXSk7CgoJJGFtb3VudCA9ICRhbW91bnQgLSAkY3VycmVudEJpbGwqJGN1cnJlbnRNYXhCaWxsczsKCQoJZm9yICgkaSA9ICRjdXJyZW50TWF4QmlsbHM7ICRpID49IDA7ICRpLS0pIHsKCQoJCSRhdHRlbXB0cysrOwoJCSRiaWxsc0NvcHkgPSAkYmlsbHM7CgkJJGJpbGxzQ29weVskY3VycmVudEJpbGxdID0gJGk7CgkJCgkJJHN1bSA9IGNvdW50QmlsbHNTdW0oJGJpbGxzQ29weSk7CgkJLy9lY2hvICJ7JGRlYnVnT2Zmc2V0fSAgaT0kaSwgYmlsbHMgIi5pbXBsb2RlKCIsICIsICRiaWxsc0NvcHkpLiIsIHN1bT0kc3VtXG4iOwoJCQoJCWlmICgkYmlsbE51bWJlciA+IDApIHsgCgkJCSR4ID0gZmluZENoYW5nZSgkYW1vdW50LCAka2V5c0JpbGxzLCAkYmlsbHNDb3B5LCAkYmlsbE51bWJlciAtIDEpOwoJCQlpZiAoJHgpIHsKCQkJCXJldHVybiAkeDsKCQkJfQoJCX0gZWxzZWlmICgkYW1vdW50ID09IDApIHsKCQkJLy9lY2hvICJ7JGRlYnVnT2Zmc2V0fSAgTUFUQ0ggIi5pbXBsb2RlKCIsICIsIGFycmF5X3ZhbHVlcygkYmlsbHNDb3B5KSkuIiAoc3VtPSRzdW0pXG4iOwoJCQkkeCA9IGltcGxvZGUoIiwgIiwgYXJyYXlfdmFsdWVzKCRiaWxsc0NvcHkpKTsKCQkJcmV0dXJuICR4OwoJCX0gCgl9Cn0KCmVjaG8gZmluZENoYW5nZSgkYW1vdW50LCAka2V5c0JpbGxzLCAkYmlsbHMsIDMpOwplY2hvICJcbiIuJGF0dGVtcHRzOw==