换钱的最少货币数
题目描述
给定数组arr,arr中所有的值都为正整数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个aim,代表要找的钱数,求组成aim的最少货币数。
如果无解,请返回-1.
代码
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) {
// write code here
int[] dp = new int[aim+1];
//最坏情况都是一块叠加上去
Arrays.fill(dp, aim+1);
//零币值所需硬币0
dp[0] = 0;
//1~aim的动态规划
for(int i=1; i<aim+1; i++){
//轮询使用每一个面值的最优解
for(int j=0; j<arr.length; j++){
//判断面值是否过大无法满足
if( i-arr[j]>=0){
dp[i] = Math.min(dp[i], dp[i-arr[j]]+1);
}
}
}
return dp[aim]>aim?-1:dp[aim];
}
}