思路
- dp数组定义:凑齐总和为j的最少硬币个数为dp[j]
- 递推公式:dp[j] = min(dp[j], 1 + dp[j-coins[i]]);
- dp数组初始化:dp[0] = 0;
- 遍历顺序:先背包再物品和先物品再背包是一样的,(组合问题先物品再背包, 排列问题先背包再物品),此处求的是最少硬币个数
- 时间复杂度:
代码
class Solution {
public:
int coinChange(vector<int>& coins, int amount) {
if(amount == 0) return 0;
int m = coins.size();
vector<long long int> dp(amount+1, INT_MAX);
dp[0] = 0;
// for(int j = 0; j <= amount; j++){
// for(int i = 0; i < m; i++){
// if(j - coins[i] <= amount && j >= coins[i]){
// dp[j] = min(dp[j], 1 + dp[j-coins[i]]);
// }
// }
// }
for(int i = 0; i < m; i++){
for(int j = 0; j <= amount; j++){
if(j - coins[i] <= amount && j >= coins[i]){
dp[j] = min(dp[j], 1 + dp[j-coins[i]]);
}
}
}
if(dp[amount] != INT_MAX) return dp[amount];
return -1;
}
};