/**
 * 最少货币数
 * @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
}