1. 概述
给出不同面额的硬币以及一个总金额. 写一个方法来计算给出的总金额可以换取的最少的硬币数量. 如果已有硬币的任意组合均无法与总金额面额相等, 那么返回
-1.可以假设:
每种硬币均有无数个
总金额不会超过10000
硬币的种类数不会超过500, 每种硬币的面额不会超过100
示例:
输入:[1, 2, 5]11输出: 3解释: 11 = 5 + 5 + 1
2. 解题
<?php
class Solution
{
/**
* @param $coins
* @param $amount
* @return int : the fewest number of coins that you need to make up
*/
public function coinChange($coins, $amount)
{
$f[0] = 0;
for ($i = 1; $i <= $amount; $i++) {
foreach ($coins as $coin) {
$preI = $i - $coin;
if ($preI < 0) continue;
$f[$i] = $f[$preI] + 1;
$f[$i] = min($f[$i], $f[$preI] + 1);
}
$f[$i] = $f[$i] ?? PHP_INT_MIN;
}
return $f[$amount] > 0 ? $f[$amount] : -1;
}
}
$coins = [1, 2, 5];
$amount = 11;
$cls = new Solution();
$r = $cls->coinChange($coins, $amount);
echo $r;
