有做教育行业的招聘网站吗百度竞价渠道代理商
给你一个整数数组 coins
,表示不同面额的硬币;以及一个整数 amount
,表示总金额。
计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1
。
你可以认为每种硬币的数量是无限的。
示例 1:
输入:coins = [1, 2, 5]amount = 11输出:3解释:11 = 5 + 5 + 1
示例 2:
输入:coins = [2]amount = 3输出:-1
思想:动态规划
边界条件:dp[0] = 0
状态转移方程:F(i) = min j=0,1...nF(i-cj) + 1
定义 F(i)为组成金额 i所需最少的硬币数量,假设在计算 F(i) 之前,我们已经计算出 F(0) ~F(i−1)
的答案,其中 cj代表的是第 j枚硬币的面值
代码:
class Solution {public int coinChange(int[] coins, int amount) {// 初始化动态规划数组 初始化最大值数组int max = amount + 1;int[] dp = new int[amount + 1]; // 数组长度最大为amount+1的原因为: 最坏情况amount= 1+1+...1// 动态规划数组中填充最大值Arrays.fill(dp,max);dp[0] = 0;// 从1开始遍历目标数值for(int i = 1; i <= amount; i++){// 遍历整数数字coins 判断数组中当前面面值是否能组成amountfor(int j = 0; j < coins.length; j++){// 如果当前数组中面值小于i 进行递归计算 (动态规划方程)if(coins[j] <= i){dp[i] = Math.min(dp[i], dp[i - coins[j]] + 1) ;}}}return dp[amount] > amount ? -1 : dp[amount];}
}