1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
| import java.util.Arrays;
public class _322零钱兑换 {
public int coinChange_recursion(int[] coins, int amount) { if (amount < 1) return 0; Arrays.sort(coins); return dfs(coins, amount, new int[amount]); }
private int dfs(int[] coins, int amount, int[] dp) { if (amount == 0) { return 0; } else if (amount < 0) { return -1; } if (dp[amount - 1] != 0) return dp[amount - 1];
int min = Integer.MAX_VALUE; for (int coin : coins) { if (coin > amount) break; int res = dfs(coins, amount - coin, dp); if (res >= 0 && res < min) min = res + 1; } dp[amount - 1] = min == Integer.MAX_VALUE ? -1 : min; return min == Integer.MAX_VALUE ? -1 : min; }
public int coinChange_2d(int[] coins, int amount) { int max = amount + 1; int len = coins.length; int[][] dp = new int[len + 1][amount + 1];
for (int i = 1; i <= coins.length; i++) { for (int j = coins[i - 1]; j <= amount; j++) { dp[i][j] = dp[i - 1][j]; if (coins[i - 1] <= j) { dp[i][j] = Math.min(dp[i][j], dp[i - 1][j - coins[i - 1]] + 1); } } } return dp[len][amount] > amount ? -1 : dp[len][amount]; }
public int coinChange_1d(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 <= coins.length; i++) { for (int j = coins[i - 1]; j <= amount; j++) { dp[j] = Math.min(dp[j], dp[j - coins[i - 1]] + 1); } } return dp[amount] > amount ? -1 : dp[amount]; }
public int coinChange_cache(int[] coins, int amount) { if (amount < 1) return 0; return coinChange(coins, amount, new int[amount]); }
private int coinChange(int[] coins, int rem, int[] count) { if (rem < 0) return -1; if (rem == 0) return 0; if (count[rem - 1] != 0) return count[rem - 1];
int min = Integer.MAX_VALUE; for (int coin : coins) { int res = coinChange(coins, rem - coin, count); if (res >= 0 && res < min) min = 1 + res; } count[rem - 1] = (min == Integer.MAX_VALUE) ? -1 : min; return count[rem - 1]; }
public static void main(String[] args) { _322零钱兑换 change = new _322零钱兑换();
System.out.println(change.coinChange_recursion(new int[]{474,83,404,3}, 264));
} }
|