动态规划:518. 零钱兑换 II

给定不同面额的硬币和一个总金额。写出函数来计算可以凑成总金额的硬币组合数。假设每一种面额的硬币有无限个。 

示例 1:

            输入: amount = 5, coins = [1, 2, 5]

            输出: 4

            解释: 有四种方式可以凑成总金额:

                    5=5

                    5=2+2+1

                    5=2+1+1+1

                    5=1+1+1+1+1

解题思路:使用动态规划:

                    1.确定状态:dp[i] 为可以凑成总金额 i 的硬币组合数;

                    2.确定状态转移方程:遍历coins,coin<i<amount,有dp[i](new) = dp[i](old) + dp[i - coin];

                    3.确定开始条件及边界条件:dp[0] = 1;

                    4.计算顺序:dp[0]——>dp[1](=0+dp[0]=1,coin=1)——>dp[2](=0+dp[1]=1,coin=1)——>dp[3](=0+dp[2]=1,coin=1)——>dp[4]——>dp[5]——>dp[2](=1+dp[0]=2,coin=2)......

class Solution {

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

        int[] dp = new int[amount+1];

        dp[0] = 1;

        for(int coin : coins) {

            for(int i=coin; i<=amount; i++) {  //遍历 coin<i<amount

                dp[i] += dp[i-coin];  // 状态转移方程: dp[i](new) = dp[i](old) + dp[i - coin]

            }

        }

        return dp[amount];

    }

}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 518 Coin Change 2 零钱兑换 II Description:You are given coins...
    air_melt阅读 221评论 0 1
  • 零钱兑换 给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的...
    BABYMISS阅读 661评论 0 2
  • 题目描述 零钱兑换 II 给定不同面额的硬币和一个总金额。写出函数来计算可以凑成总金额的硬币组合数。假设每一种面额...
    一只可爱的柠檬树阅读 412评论 0 0
  • 题目 给定不同面额的硬币和一个总金额。写出函数来计算可以凑成总金额的硬币组合数。假设每一种面额的硬币有无限个。 示...
    ST_码阅读 168评论 0 0
  • 我是黑夜里大雨纷飞的人啊 1 “又到一年六月,有人笑有人哭,有人欢乐有人忧愁,有人惊喜有人失落,有的觉得收获满满有...
    陌忘宇阅读 8,605评论 28 53