题目描述
给定数组arr,arr中所有的值都为正整数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个aim,代表要找的钱数,求组成aim的最少货币数。
如果无解,请返回-1.
【要求】
时间复杂度O(n \times aim)O(n×aim),空间复杂度On。
示例1
输入:
[5,2,3],20
返回值:
4
示例2
输入:
[5,2,3],0
返回值:
0
代码
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 Max = aim + 1;//定一个全局最大值
int []dp = new int[aim + 1];//dp[i]的含义是目标值为i的时候最少钱币数是多少。
Arrays.fill(dp,Max);//把dp数组全部定为最大值
dp[0] = 0;//总金额为0的时候所需钱币数一定是0
for(int i = 1;i <= aim;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];
}
}