【LeetCode-518】零钱兑换 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

解答

class Solution {
public:
    int change(int amount, vector<int>& coins) {
        vector<int> dp(amount + 1, 0);
        dp[0] = 1; // 剩余金额能到0,本次次数+1
        for (int i : coins) {
            for (int j = i; j <= amount; j++) {
                dp[j] += dp[j - i];
            }
        }
        return dp[amount];
    }
};

重点思路

本题为经典的完全背包(物品可以重复取用)中的组合问题(不关心取用的顺序)。所以外层循环为物品重量,内层循环为背包容量。

posted @ 2021-03-26 12:36  tmpUser  阅读(34)  评论(0编辑  收藏  举报