描述
给定数组arr,arr中所有的值都为正整数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个aim,代表要找的钱数,求组成aim的最少货币数。
如果无解,请返回-1.

import java.util.Arrays;

public class MinMoneySolve {
/**
* 最少货币数
* @param arr int整型一维数组 the array
* @param aim int整型 the target
* @return int整型
*/
public int minMoney (int[] arr, int aim) {
//小于1的都返回0
if(aim < 1){
return 0;
}

int[] dp = new int[aim+1];
//dp[i]表示凑齐i元最少需要多少货币数
Arrays.fill(dp,aim+1);

dp[0] = 0;
//遍历1-aim元
for (int i = 1; i <= aim; i++) {
for (int j = 0; j < arr.length; j++) { // 2,6
//如果面值不超过要凑的钱才能用
if(arr[j] <= i){
//维护最小值
dp[i] = Math.min(dp[i], dp[i-arr[j]]+1); // arr[j]算使用一张货币
}
}
}

for (int i = 0; i < dp.length; i++) {
System.out.print(String.valueOf(dp[i])+" ");
}
System.out.println();
//如果最终答案大于aim代表无解
return dp[aim] > aim ? -1 : dp[aim];
}

public static void main(String[] args) {
int[] arr = {2,6};
//int[] arr = {2};
int aim = 5;
//aim = 1;
MinMoneySolve moneySolve = new MinMoneySolve();
System.out.println(moneySolve.minMoney(arr,aim));
}
}