方法一:
void combine_sum1_dfs(vector<vector<int>> &combine_sum1_res, vector<int> & nums, vector<int>&seq, int pos, int rest)
{
if (rest == 0)
{
combine_sum1_res.push_back(seq);
return;
}
if (pos == nums.size() or rest < nums[pos])
return;
combine_sum1_dfs(combine_sum1_res, nums, seq, pos + 1, rest);
seq.push_back(nums[pos]);
combine_sum1_dfs(combine_sum1_res, nums, seq, pos + 1, rest - nums[pos]);
seq.pop_back();
}
vector<vector<int>> combine_sum1(vector<int> & nums, int target)
{
sort(nums.begin(), nums.end());
vector<vector<int>> combine_sum1_res;
vector<int> seq;
combine_sum1_dfs(combine_sum1_res, nums, seq, 0, target);
return combine_sum1_res;
}
方法二:
vector<vector<int>> res;
vector<int> seq;
vector<vector<int>> freq;
void combine_sum_dfs(int pos, int rest)
{
if (rest == 0)
{
res.push_back(seq);
return;
}
if (pos == freq.size() or rest < freq[pos][0])
return;
combine_sum_dfs(pos + 1, rest);
int most = min(rest / freq[pos][0], freq[pos][1]);
for (int i = 1; i <= most; i++)
{
seq.push_back(freq[pos][0]);
combine_sum_dfs(pos + 1, rest - i * freq[pos][0]);
}
for (int i = 1; i <= most; i++)
{
seq.pop_back();
}
}
vector<vector<int>> combine_sum(vector<int> & nums, int target)
{
sort(nums.begin(), nums.end());
//for (auto num : nums)
//{
// if (num_freq.count(num))
// num_freq[num]++;
// else
// num_freq[num] = 1;
//}
for (auto num : nums)
{
int size = freq.size();
if (freq.empty() || num != freq[size - 1][0])
{
freq.push_back({ num,1 });
}
else
freq[size - 1][1] += 1;
}
combine_sum_dfs(0, target);
return res;
}