数字的最优组合算法

关于数字的最优组合的算法,记得上学时数学考试还有过这么一道题目~
比如:顾客去商店买东西,前台结账时应付总额为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);


 

你可能感兴趣的:(程序算法,算法,input,join)