零钱兑换2

发布时间 2023-03-28 21:41:08作者: COMEIN

原题链接

代码

class Solution {
public:
    int change(int amount, vector<int>& coins) {
        vector<int> dp(amount + 1, 0<details>
        dp[0] = 1;
        for (int j = 0; j <= amount; ++j) {
            for (int i = 0; i < coins.size(); ++i)
                if (j >= coins[i]) { dp[j] += dp[j - coins[i]];
                cout << "dp[" << j << "] += dp[" << j - coins[i] << "]" << endl;}
        }
        return dp[amount];
    }
};

难点详解测试

以测试数据 5 【1,2,5】为例

  • 组合数,外层遍历coins(i)
    dp[1] += dp[0]
    dp[2] += dp[1]
    dp[3] += dp[2]
    dp[4] += dp[3]
    dp[5] += dp[4]
    dp[2] += dp[0]
    dp[3] += dp[1]
    dp[4] += dp[2]
    dp[5] += dp[3]
    dp[5] += dp[0]
    
  • 排列数,外层遍历amount(j)
    dp[1] += dp[0]
    dp[2] += dp[1]
    dp[2] += dp[0]
    dp[3] += dp[2]
    dp[3] += dp[1]
    dp[4] += dp[3]
    dp[4] += dp[2]
    dp[5] += dp[4]
    dp[5] += dp[3]
    dp[5] += dp[0]