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] ; } }