美文网首页
动态规划:518. 零钱兑换 II

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

作者: 言的希 | 来源:发表于2021-06-10 16:32 被阅读0次

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

示例 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. 零钱兑换 II

      本文链接:https://www.haomeiwen.com/subject/flxpeltx.html