/**
* 最少货币数
* @param arr int整型一维数组 the array
* @param aim int整型 the target
* @return int整型
*/
func minMoney( arr []int , aim int ) int {
// write code here
// 定义一个最大值
max := aim + 1
// dp[i]含义 目标金额为i使,需要最少的兑换数量
// aim+1是指 从0元开始到aim元为止的位置
dp := make([]int, aim+1)
// dp中每一个数初始化为最大值
for i:=0; i<len(dp); i++{
dp[i] = max
}
// 目标金额为0时, 不需要兑换,所以为0
dp[0] = 0
// 从金额1开始到目标金额aim,来对dp进行填充
for i:=1; i<= aim; i++{
// 能兑换的金额数组
for j := 0; j < len(arr); j++{
// 当前的目标金额为i
// 当前金额小于等于目标金额的话,就可以兑换
// dp[i-arr[j]]+1
// dp[i-arr[j]]
//因为金额i 兑换了arr[j]元一张(所以+1),剩下的金额就是 i-arr[j]
// 金额 i-arr[j] 的最小兑换数 就是 dp[i-arr[j]]
if arr[j] <= i {
dp[i] = min(dp[i], dp[i-arr[j]]+1)
}
}
}
// 等于max说明,不能兑换
if dp[aim] == max {
return -1
}
return dp[aim]
}
func min(a, b int)int{
if a>b{return b}
return a
}