零钱兑换

77 阅读1分钟

题目

动态规划

public class Main {
    public static void main(String[] args) {

        Main main = new Main();
        int [] nums = new int[]{2};
        main.coinChange(nums, 3);
    }

    public int coinChange(int[] coins, int amount) {

        int [] dp = new int[amount + 1];
        dp[0] = 0;
        for (int i = 1; i < amount + 1; i ++) {
            int tempMin = Integer.MAX_VALUE;
            for (int j = 0; j < coins.length; j ++) {
                int coin = coins[j];
                int preKind = i - coin >= 0 ? dp[i - coin] : -1;
                if (preKind < 0) {
                    continue;
                }
                tempMin = Math.min(preKind, tempMin);
            }
            if (tempMin == Integer.MAX_VALUE) {
                dp[i] = -1;
            } else {
                dp [i] = tempMin + 1;
            }

        }

        return dp[amount];

    }
}

基本思路

  1. 目标金额i只能由某个金额j, 再选择一枚硬币后得到, 因此枚举所有的j, 找出最小的dp[j], dp[i] = min_dp[j] + 1; 注意dp[j]可能为-1的情况

  2. 注意一下边界