【DP】Leetcode 322 Coin Change

题目链接

322. 零钱兑换

思路

因为硬币数量是无限的,所以无法以硬币数量作为状态进行遍历。选择目标金额为状态进行遍历。即 dp[i] 表示目标金额为 i 的情况下所需的最小硬币个数。

对于每个目标金额,遍历每个硬币 j,当前状态转移为:

dp[i]=min(dp[i],dp[icoins[j]])

代码

class Solution {
    public int coinChange(int[] coins, int amount) {
        int n = coins.length;
        if(n == 0){
            return -1;
        }

        // dp[i] 表示目标金额为 i 的情况下,所使用的最小硬币数量
        int[] dp = new int[amount + 1];
        Arrays.fill(dp, amount + 1);
        dp[0] = 0;
        for(int i = 1; i <= amount; ++i){
            for(int j = 0; j < n; ++j){
                if(i - coins[j] >= 0){
                    // dp[i]有两种实现的方式,
                    // 一种是包含当前的coins[j],那么剩余钱就是 i-coins[j],这种操作要兑换的硬币数是 dp[i-coins[j]] + 1
                    // 另一种就是不包含,要兑换的硬币数是dp[i]
                    dp[i] = Math.min(dp[i - coins[j]] + 1, dp[i]);
                }
            }
        }

        return dp[amount] == amount + 1 ? -1 : dp[amount];
    }
}
posted @   Frodo1124  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示