思路:记忆化搜索,定义函数查找以index开始,值为target的个数,顺便对nums排序减少不必要的搜索。
代码如下:
class Solution {
public:
int combinationSum4(vector<int>& nums, int target) {
int result = 0;
if(nums.empty() || target == 0) return result;
sort(nums.begin(), nums.end());
vector<vector<int> > path(nums.size(), vector<int>(target + 1, -1));
for(int i = 0; i < nums.size(); ++i)
result += get(i, target, path, nums);
return result;
}
private:
int get(int index, int target, vector<vector<int> > &path, vector<int>& nums) {
if(target == nums[index]) path[index][target] = 1;
if(target < nums[index]) path[index][target] = 0;
if(path[index][target] != -1)
return path[index][target];
int cnt = 0;
target -= nums[index];
for(int i = 0; i < nums.size(); ++i)
cnt += get(i, target, path, nums);
path[index][target + nums[index]] = cnt;
return cnt;
}
};