思路
- dp数组定义:完全背包,不限物品使用次数,使用0-i的硬币,总和小于等于j的组合方式有dp[i][j]个
- 递推公式:
if(j >= coins[i]) dp[i][j] = dp[i-1][j] + dp[i][j - coins[i]];
elsedp[i][j] = dp[i-1][j];
- dp数组初始化:第一行以及第一列初始化为1
- 遍历顺序:左右,上下
- 时间复杂度:
代码
class Solution {
public:int change(int amount, vector<int>& coins) {int m = coins.size();vector< vector<unsigned long long>> dp(m, vector<unsigned long long>(amount + 1, 0));if(coins[0] <= amount) dp[0][coins[0]] = 1;for (int j = coins[0] + 1; j <= amount; j++) {dp[0][j] = dp[0][j - coins[0]];}for (int i = 0; i < m; i++) {dp[i][0] = 1;}for(int i = 1; i < m; i++){for(int j = 0; j <= amount; j++){if(j >= coins[i]) dp[i][j] = dp[i-1][j] + dp[i][j - coins[i]];elsedp[i][j] = dp[i-1][j];}}return dp[m-1][amount];}
};