关于数字的最优组合的算法,记得上学时数学考试还有过这么一道题目~
比如:顾客去商店买东西,前台结账时应付总额为31元,顾客拿出一张百元大钞,此时店员应找69元,求最优的找钱方案。
找钱的方案可以为:6*10元+5元+4*1元 或者 50元+10元+5元+2元+2元等等,此算法可以直接获取最优结果。
/**
* @brief 最优找钱方案
* @author chendeshan
* @param $sum_money int 要找的钱数
* @param $moneyBox array 抽屉里面有的币种
*/
function find_money($sum_money,$moneyBox)
{
if($sum_money < 0)
{
return 'please input a accurate sum_money';
}
$result = array();
rsort($moneyBox);
foreach($moneyBox as $val)
{
if($sum_money >= $val)
{
$z_shu = floor($sum_money / $val);
$y_shu = $sum_money % $val;
for($i = 0;$i < $z_shu;$i++)
{
$result[] = $val;
}
if($y_shu > 0)
{
$sum_money = $y_shu;
}
else
{
return join('+',$result);
}
}
}
return 'the money box can not find exact money';
}
$sum_money = 16; //要找的总钱数
$moneyBox = array(1,10,5,2); //钱箱中存在的币种
$result = find_money($sum_money,$moneyBox);
print_r($result);