int coinChange(int[] coins, int amount) { int[] dp = new int[amount + 1]; // 数组⼤⼩为 amount + 1,初始值也为 amount + 1 Arrays.fill(dp, amount + 1); // base case dp[0] = 0; // 外层 for 循环在遍历所有状态的所有取值 for (int i = 0; i < dp.length; i++) { // 内层 for 循环在求所有选择的最⼩值 for (int coin : coins) { // ⼦问题⽆解,跳过 if (i - coin < 0) {continue; } dp[i] = Math.min(dp[i], 1 + dp[i - coin]); } } return (dp[amount] == amount + 1) ? -1 : dp[amount]; }
时间: 2024-01-26 12:02:39 浏览: 116
coin_change_problem
这是一个使用动态规划解决硬币找零问题的代码。该算法的基本思路是:对于任意的金额数,我们都可以通过计算凑出该金额所需的最小硬币数来解决问题。具体步骤如下:
1. 创建一个长度为 amount+1 的数组 dp,初始值为 amount+1,用来存储凑出每个金额所需的最小硬币数。
2. 将 dp[0] 的值设置为 0,表示凑出金额为 0 所需的最小硬币数为 0。
3. 遍历 dp 数组,对于每个 i,遍历硬币数组 coins,如果当前硬币面值 coin 小于等于 i,那么说明可以使用该硬币凑出金额为 i,此时更新 dp[i] 的值为 dp[i-coin]+1 和 dp[i] 本身中的较小值。
4. 最终返回 dp[amount],如果其值等于 amount+1,则说明无法凑出该金额,返回 -1。
该算法的时间复杂度为 O(amount * n),其中 n 是硬币数组的长度。
阅读全文