题目
给定数组arr,arr中所有的值都为正整数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个aim,代表要找的钱数,求组成aim的最少货币数。
如果无解,请返回-1。
数据范围:数组大小满足 0≤n≤10000 , 数组中每个数字都满足 0<val≤10000,0≤aim≤5000。
要求:时间复杂度 O(n×aim) ,空间复杂度 O(aim)。
示例1
输入:
[5,2,3],20
返回值:
4
示例2
输入:
[5,2,3],0
返回值:
0
示例3
输入:
[3,5],2
返回值:
-1
备注:
0≤n≤10000
0≤aim≤5000
代码
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) {
//1.创建dp表
int n = arr.length, INF = 0x3f3f3f3f;
int[][] dp = new int[n + 1][aim + 1];
//2.初始化
for(int j = 1; j <= aim; j++) {
dp[0][j] = INF;
}
//3.填表
for(int i = 1; i <= n; i++) {
for(int j = 0; j <= aim; j++) {
dp[i][j] = dp[i - 1][j];
if(j >= arr[i - 1]) {
dp[i][j] = Math.min(dp[i][j], dp[i][j - arr[i - 1]] + 1);
}
}
}
//4.返回值
return dp[n][aim] >= INF ? -1 : dp[n][aim];
}
}