LeetCode 518

https://leetcode.cn/problems/coin-change-ii/description/

难度:中等

高频面试题汇总:https://www.yuweihung.com/posts/2025/lc-hot/

完全背包题目。

dfs(i, c) = dfs(i − 1, c) + dfs(i, c − coins[i])

时间复杂度:O(n⋅amount),其中 n 为 coins 的长度。

空间复杂度:O(n⋅amount)。

class Solution {
public:
    int change(int amount, vector<int>& coins) {
        int n = coins.size();
        // 和答案无关的转移可能会溢出,从而报错
        // 为了避免报错,使用 unsigned
        vector f(n + 1, vector<unsigned>(amount + 1));
        f[0][0] = 1;
        for (int i = 0; i < n; i++) {
            for (int c = 0; c <= amount; c++) {
                if (c < coins[i]) {
                    f[i + 1][c] = f[i][c];
                } else {
                    f[i + 1][c] = f[i][c] + f[i + 1][c - coins[i]];
                }
            }
        }
        return f[n][amount];
    }
};