这道题和上一道题279.完全平方数的套路是完全一样的,但是这道题不需要我们自己生成物品列表,函数的输入中已经给出了,但是这道题有一个坑,就是我们在初始化dp
数组的时候,所有的位置不应该赋值为INT_MAX
,因为在dp[j - nums[i]] + 1
这一步可能出现溢出的情况,所以我们应当初始化为一个稍小的较大值,如INT_MAX / 2
等。这个思路是一样的,这里就简单的说一下动规五部曲:
1.确定dp[j]
的含义:在背包容量为j的情况下,装满背包的最少硬币个数为dp[j]
2.确定递推公式 dp[j] = min(dp[j - coins[i]] + 1, dp[j]);
3.dp数组初始化 dp[0] = 0
4.确定遍历顺序:先物品,再背包(不涉及排列组合的问题,可以颠倒)
5.打印数组(省略)
class Solution {
public:
int coinChange(vector<int>& coins, int amount) {
//1.确定dp[j]的含义:在背包容量为j的情况下,装满背包的最少硬币个数为dp[j]
//2.确定递推公式 dp[j] = min(dp[j - coins[i]] + 1, dp[j]);
//3.dp数组初始化 dp[0] = 0
//4.确定遍历顺序:先物品,再背包(可以颠倒)
//5.打印数组(省略)
vector<int> dp(amount + 1, INT_MAX / 2);
//初始化
dp[0] = 0;
for(int i = 0; i < coins.size(); i++){ //遍历物品
for(int j = coins[i]; j <= amount; j++) //遍历背包
dp[j] = min(dp[j - coins[i]] + 1, dp[j]);
}
return dp[amount] == INT_MAX / 2 ? -1 : dp[amount];
}
};