力扣HOT100之动态规划:322. 零钱兑换
这道题和上一道题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];}
};