/** * 给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。 * 输入: coins = [1, 2, 5], amount = 11,输出: 3 解释: 11 = 5 + 5 + 1 * 输入: coins = [2], amount = 3,输出: -1 */ public class DP { public static int exchangeRecursive(int amount, int[] coins) { if (amount == 0) { return 0; } if (amount < 0) { return -1; } int result = Integer.MAX_VALUE; for(int i = 0; i< coins.length; i ++) { int subMin = exchangeRecursive(amount - coins[i], coins); if(subMin == -1) continue; result = Math.min(result, subMin + 1); } // 说明没有符合问题的解 if (result == Integer.MAX_VALUE) { return -1; } return result; } private static int exchangeDP(int amount, int[] coins) { int[] dp = new int[amount + 1]; // 初始化每个值为 amount+1,这样当最终求得的 dp[amount] 为 amount+1 时,说明问题无解 for (int i = 0; i < amount + 1; i++) { dp[i] = amount + 1; } // 0 硬币本来就没有,所以设置成 0 dp[0] = 0; for (int i = 0; i < amount + 1; i++) { for (int j = 0; j < coins.length; j++) { if (i >= coins[j]) { dp[i] = Math.min(dp[i- coins[j]]+1, dp[i]); } } } if (dp[amount] == amount + 1) { return -1; } return dp[amount]; } public static void main(String[] args) { int amount = 11; int[] coins = {1,2,5}; int result = exchangeRecursive(amount, coins); System.out.println("result = " + result); } }
给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1
最新推荐文章于 2024-01-12 13:33:36 发布