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(arr == null || arr.length == 0) return -1 ;
int f[] = new int[aim+1] ;//f[i]表示价值i的最少找零货币数目
return help(arr , aim , f) ;
}
public int help(int arr[] , int aim , int f[]) {
if(aim == 0) return 0 ;
if(aim < 0) return -1 ;
if(f[aim] != 0) return f[aim] ;//如果为零说明还未计算,不为零说明已经计算
int min = -1 ;//当前价值的最小货币数,-1表示无法找零
for(int i = 0 ; i < arr.length ; i ++) {//遍历每一种货币
int tmp = help(arr , aim - arr[i] , f) ;
if(tmp != -1) {//可以找零
if(min == -1) {//是默认值
min = tmp + 1 ;
} else {
min = Math.min(min , tmp + 1) ;
}
}
f[aim] = min ;//更新f[]
}
return f[aim] ;
}
}