数字的最优组合算法

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


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值