目录
518 零钱兑换 II
377 组合总和 Ⅳ
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];}
};