目录
518 零钱兑换 II
class Solution {
public:
int change(int amount, vector<int>& coins) {
//1 dp数组代表j时能凑成j的方法
vector<int> dp(amount + 10, 0);
//2 初始化
//注意本题我们凑成amount = 0的方式是1种就是只取0或一个元素都不取
dp[0] = 1;
for(int i = 0; i < coins.size(); i++){
for(int j = coins[i]; j <= amount; j++){
//j 代表背包容量,dp[j] 是取最大值
//dp[j] 代表我们什么都不取
//dp[j - coins[i]] + dp[j] 表示我们去了coins[i]就要减去
dp[j] = max(dp[j], dp[j - coins[i]] + dp[j]);
}
}
return dp[amount];
}
};
377 组合总和 Ⅳ
class Solution {
public:
int combinationSum4(vector<int>& nums, int target) {
//1 dp数组:容量为j是由几种凑成j的方法数
vector<int> dp(target+2, 0);
//2 初始化,把第一个数默认成1,其他默认成0就好。
dp[0] = 1;
//3 遍历nums.size()
for(int i = 0; i <= target; i++){//背包
for(int j = 0; j < nums.size(); j++){//物品
//如果当前背包的容量比物品大,且
if (i - nums[j] >= 0 && dp[i] < INT_MAX - dp[i - nums[j]]) {
dp[i] += dp[i - nums[j]];
}
}
}
return dp[target];
}
};