牛客地址
解题思路: 动态规划(不能使用贪心!!!)
1. 状态转移方程
2. 初始化边界
注意初始化为MAX_VALUE - 1, 因为后面有加1的操作,直接设置为MAX_VALUE的话结果不对。
实现代码
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
if(arr == null || arr.length == 0){
return -1;
}
int len = arr.length;
int[] dp = new int[aim + 1];
Arrays.fill(dp, Integer.MAX_VALUE - 1);
dp[0] = 0;
for(int i = 1; i <= aim; i++){
for(int j = 0; j < len; j++){
if(i - arr[j] >= 0){
dp[i] = Math.min(dp[i], dp[i-arr[j]] + 1);
}
}
}
return dp[aim] == Integer.MAX_VALUE - 1? -1 : dp[aim];
}
}