代码随想录算法训练营第四十四天 | 518. 零钱兑换 II、377. 组合总和 Ⅳ

57 阅读1分钟

代码随想录算法训练营第四十四天 | 518. 零钱兑换 II、377. 组合总和 Ⅳ

518. 零钱兑换 II

题目链接:518. 零钱兑换 II

  • 求方法数,很经典,但是要注意是组合数

377. 组合总和 Ⅳ

题目链接:377. 组合总和 Ⅳ

  • 先背包容量,后物品,则是排列

image-20230323132956922

  • 使用记忆化递归
  •  ​
     class Solution {
     public:
         unordered_map<int, int> memo;
         int dp(vector<int>& nums, int remains) {
             if(memo.count(remains) != 0) {
                 return memo[remains];
             }
             if(remains == 0) {
                 return 1;
             } 
             if (remains < 0) {
                 return 0;
             }
             int res = 0; // 方法数
             for (int i = 0; i < nums.size(); i++) {
                 res += dp(nums, remains - nums[i]);
             }
             memo[remains] = res;
             return memo[remains];
         }
         int combinationSum4(vector<int>& nums, int target) {
             return dp(nums, target);
         }
     };