做导航网站赚钱,2019个人建设网站,WordPress添加上传下载,上海微网站制作建设LeetCode322.给你一个整数数组 coins,表示不同面额的硬币#xff0c;以及一个整数 amount#xff0c;表示总金额。计算并返回可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额#xff0c;返回-1。你可以认为每种硬币的数量是无限的。
示例1…LeetCode322.给你一个整数数组 coins,表示不同面额的硬币以及一个整数 amount表示总金额。计算并返回可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额返回-1。你可以认为每种硬币的数量是无限的。
示例1 输入coins[1,2,5]amount 11 输出3 解释11 5 5 1
示例2 输入coins[2,5,7],amount27 输出3 解释21 7 7 7
public int coinChange(int[] coins, int amount) {int max amount 1;int[] dp new int[amount 1];Arrays.fill(dp, max);dp[0] 0;for (int i 1; i amount; i) {for (int j 0; j coins.length; j) {if (coins[j] i) {dp[i] Math.min(dp[i], dp[0] 1);}}}return dp[amount] amount ? -1 : dp[amount];
}
当金额为0时我们默认需要0个硬币来组成该金额。
在这里的两层 for 循环中要把1到 amount 的每一个数都遍历在第二层循环中遍历已知硬币如果当前遍历的硬币小于等于 i 的话就说明可以用这个硬币那么就让当前的 dp 等于dp[i]和 dp[0] 1中的一个。
在dp数组当中每一个值都是通过前面的值推导出来的。