import java.util.*;


public class Solution {
    /**
     * 最少货币数
     * @param arr int整型一维数组 the array
     * @param aim int整型 the target确定      * @return int整型
     */
    public int minMoney (int[] arr, int aim) {
        if(aim == 0) return 0 ;
        //f[i]表示,对于价值i的最少找零货币数目
        int f[] = new int[aim + 1]  ;
        for(int i = 0 ; i <= aim ; i ++) {//每种价值
            f[i] = Integer.MAX_VALUE ;//表示每个面值都默认不能被找零
            for(int j = 0 ; j < arr.length ; j ++) {//每种货币
                if(arr[j] == i) {//如果价值就等于当前货币的面值,那么只需要一张即可
                    f[i] = 1 ;
                    continue ;
                } 
                //如果当前货币小于价值,则可以假设已经找零当前货币,剩下的价值继续
                //寻找最小货币数目
                if(arr[j] < i) {
                    if(f[i-arr[j]] != Integer.MAX_VALUE) {//只有剩下的价值可以被找零才进行考虑
                        f[i] = Math.min(f[i] , f[i-arr[j]] + 1) ;    
                    }
                }
               
            }
        }
        return f[aim] == Integer.MAX_VALUE ? -1 : f[aim] ;  
    }
}