LeetCode-518. 零钱兑换 II

题目描述 零钱兑换 II

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

示例

输入: amount = 5, coins = [1, 2, 5]
输出: 4
解释: 有四种方式可以凑成总金额:
5=5
5=2+2+1
5=2+1+1+1
5=1+1+1+1+1

解题思路

动态规划,用滚动一维dp就好,不过要注意里面两个for循环位置不能换啊,别想错了,跟我一样傻兮兮的你就就完蛋了。

  • DP定义:记dp[i]为凑成总金额i的组合数;
  • DP初始:dp[0] = 1,dp[1, 2,....., i] = 0;
  • DP更新:dp[i] = dp[i] + dp[i-coin];

代码

class Solution {
public:
    int change(int amount, vector& coins) {
        vector nums(amount+1, 0);
        nums[0] = 1;
        for(auto coin:coins ){
            for(int j=coin;j<=amount;j++){
                nums[j] += nums[j-coin];
            }
        }
        return nums[amount];
    }
};

你可能感兴趣的:(LeetCode-518. 零钱兑换 II)