描述
给定数组arr,arr中所有的值都为正整数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个aim,代表要找的钱数,求组成aim的最少货币数。
如果无解,请返回-1.
示例1
输入:
[5,2,3],20
返回值:
4
示例2
输入:
[5,2,3],0
返回值:
0
示例3
输入:
[3,5],2
返回值:
-1
解题思路
以示例1 为例子,想要凑出20元,那就累积凑成1-20之间的所有金额最小需要的硬币数,累积最后可得出20的最小数量
import java.util.*;
public class Solution {
public int minMoney (int[] arr, int aim) {
//若aim小于0则返回-1;
if(aim<1){
return 0;
}
//凑成1-aim金额的数量
int[] dp = new int[aim+1];
Arrays.fill(dp,aim+1);
dp[0]=0;
for(int i=1;i<=aim;i++){
//根据已有的金额硬币凑出i
for(int j=0;j<arr.length;j++){
if(arr[j]<=i){
//可以凑
dp[i] = Math.min(dp[i],dp[i-arr[j]]+1);
}
}
}
return dp[aim]>aim?-1:dp[aim];
}
}