\$\begingroup\$
\$\endgroup\$
3
I have written code based on the Greedy Algorithm. The example can be found here.
Problem: Make a change of a given amount using the smallest possible number of coins.
Coins available are:
- dollars (100 cents)
- quarters (25 cents)
- dimes (10 cents)
- nickels (5 cents)
- pennies (1 cent)
This outputs an array of coins:
<?php
function makeChange($amount) {
$c = array(100, 25, 10, 5, 1);
$sol = array();
$sum = 0;
$i = 0;
$ele = $c['0'];
while ($sum != $amount) {
$sum = $sum + $ele;
if ($sum > $amount) {
$sum = $sum - $ele;
$i++;
$ele = $c[$i];
continue;
}
$sol[] = $ele;
}
return $sol;
}
$amount = 356;
$sol = makeChange($amount);
print_r($sol);
?>
Can this become more optimized?
Jamal
35.2k13 gold badges134 silver badges238 bronze badges
asked Sep 30, 2015 at 13:06
-
3\$\begingroup\$ Did you test it? If your code doesn't work as intended, it's not ready for a peer review. \$\endgroup\$Mathieu Guindon– Mathieu Guindon2015年09月30日 13:18:19 +00:00Commented Sep 30, 2015 at 13:18
-
\$\begingroup\$ Why so many down votes? It really discourages the OP. However I have updated my question. \$\endgroup\$PHP Learner– PHP Learner2015年10月01日 04:51:36 +00:00Commented Oct 1, 2015 at 4:51
-
\$\begingroup\$ Since you say it's correct, you can revise the questions to no longer ask about correctness. The update statement can also be removed along with that. \$\endgroup\$Jamal– Jamal2015年10月01日 04:55:46 +00:00Commented Oct 1, 2015 at 4:55
1 Answer 1
\$\begingroup\$
\$\endgroup\$
0
The following is a bit of variation, exploiting that one does not need to subtract the same coin value one-by-one.
$c = array(100, 25, 10, 5, 1); // $coins
$n = array( 0, 0, 0, 0, 0); // Number of coins.
$i = 0;
while ($amount > 0) {
$k = floor($amount / $c[$i]); // How many coins
$n[$i] = $k;
$amount -= $k * $c[$i];
// Or shorter: $amount %= $c[$i];
++$i;
}
Also, I subtract from the original amount instead of adding to $sum
.
Quill
12k5 gold badges41 silver badges93 bronze badges
answered Sep 30, 2015 at 14:44
lang-php