前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >322. 零钱兑换

322. 零钱兑换

作者头像
名字是乱打的
发布2021-12-24 08:30:49
2170
发布2021-12-24 08:30:49
举报
文章被收录于专栏:软件工程

一 题目

二 思路:

动态规划既找子问题,由子问题递推大问题.

拆分coins =[1, 2, 5],amount=11,那么面值为11的最小可能和为以下可能的最小值:

  • 面值为1的硬币最小可能组合数(1),加面值为(11-1)=10的最小可能组合数量
  • 面值为2的硬币最小可能组合数,加面值为9的最小可能组合数量
  • 面值为5的硬币最小可能组合数,加面值为6的最小可能组合数量

我们 设dp[amount]为金额为amount的最小可能组合 这里dp[11]=min(1+dp[11-coins[0],1+coins[11-coins[1],1+coins[11-coins[2])

即dp[amount] = min(dp[amount], 1 + dp[amount - coins[i]]) for i in [0, len - 1] if coins[i] <= amount

同时我们要知道和注意:

  • 某些子dp就是有可能不存在,这种情况我们不需要进行比较,因为它不是我们大的金额的子问题

三代码:

代码语言:javascript
复制
 class Solution {
        public int coinChange(int[] coins, int amount) {
            int[] dp = new int[amount + 1];

            //这里我们要求最小组合数,因此这里可以填充最大值
            Arrays.fill(dp, Integer.MAX_VALUE);

            //0元的组合必然啥都么有
            dp[0] = 0;

            for (int i = 1; i <= amount; i++) {
                //遍历每种可能
                for (int coin : coins) {
                    //1. i - coin >= 0 意思当前硬币要小于等于我们要凑的钱数,另外要凑的子金额要大于0;
                    //2. dp[i - coin] != Integer.MAX_VALUE 意思我们剩下的钱也是要能凑齐的才行;
                    //   不是所有的dp都有意义,有可能这个组合就是不存在,因此这里也可以理解为只有除掉不可拆分的硬币之外剩余的钱必须能被凑齐才有意义做为比较值;
                    if (i - coin >= 0 && dp[i - coin] != Integer.MAX_VALUE) {
                        dp[i] = Math.min(dp[i - coin] + 1, dp[i]);
                    }
                }
            }

            return dp[amount] == Integer.MAX_VALUE ? -1 : dp[amount];
        }


    }
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/12/4 下,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一 题目
  • 二 思路:
  • 三代码:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档