Учитывая массив различных целых чисел nums и целевое целое число target, верните количество возможных комбинаций, которые в сумме составляют target.

Тестовые примеры генерируются таким образом, чтобы ответ умещался в виде 32-разрядного целого числа.

Пример:

Input: nums = [1,2,3], target = 4
Output: 7
Explanation:
The possible combination ways are:
(1, 1, 1, 1)
(1, 1, 2)
(1, 2, 1)
(1, 3)
(2, 1, 1)
(2, 2)
(3, 1)

Решение:

С помощью чисел в массиве nums нам нужно создать сумму цели.

Понимание: мы видим, что числа в массиве nums могут повторяться, поэтому нам не нужно отслеживать индекс nums.

Информация о перекрывающихся подзадачах:

Рассмотрим пример, nums = [1,2] и target=2:

Следовательно, результат = 2

Код:

Базовое состояние:

если currentSum превышает цель: возвращает 0

если currentSum равно target: возвращает 1

class Solution {
public:
    
    vector<int> dp;
    int combinationSum4(vector<int>& nums, int target) {
         dp.resize(1001);
        fill(dp.begin(), dp.end(), -1);
        
        return solve(nums, target,0);
    }
    
    int solve(vector<int>& nums, int target, int currSum){
        if(currSum > target) return 0;
        if(currSum == target) return 1;
        if(dp[currSum] != -1) return dp[currSum];
        int ways = 0;
        for(int i=0; i<nums.size(); i++) {
            if(currSum + nums[i] <= target)
                ways += solve(nums, target, currSum + nums[i]);
        }
        return dp[currSum] = ways;
    }
    
};