Leetcode39. Combination Sum

来源:互联网 发布:平安淘宝信用卡 编辑:程序博客网 时间:2024/06/09 18:05

Leetcode39. Combination Sum

题目:Given a set of candidate numbers (C(without duplicates) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.

The same repeated number may be chosen from C unlimited number of times.

Note:

  • All numbers (including target) will be positive integers.
  • The solution set must not contain duplicate combinations.

For example, given candidate set [2, 3, 6, 7] and target 7
A solution set is: 

[  [7],  [2, 2, 3]]

题意分析:这道题,选择用回溯的方法去做。采用的方法也是类似背包问题,先假设放进去,不行再取出来。

void combinationSum(std::vector<int> &candidates, int target, std::vector<std::vector<int> > &res, std::vector<int> &combination, int begin) {if (!target) {res.push_back(combination);return;}for (int i = begin; i != candidates.size() && target >= candidates[i]; ++i) {combination.push_back(candidates[i]);combinationSum(candidates, target - candidates[i], res, combination, i);combination.pop_back();}}

代码:

class Solution {public:std::vector<std::vector<int> > combinationSum(std::vector<int> &candidates, int target) {std::sort(candidates.begin(), candidates.end());std::vector<std::vector<int> > res;std::vector<int> combination;combinationSum(candidates, target, res, combination, 0);return res;}private:void combinationSum(std::vector<int> &candidates, int target, std::vector<std::vector<int> > &res, std::vector<int> &combination, int begin) {if (!target) {res.push_back(combination);return;}for (int i = begin; i != candidates.size() && target >= candidates[i]; ++i) {combination.push_back(candidates[i]);combinationSum(candidates, target - candidates[i], res, combination, i);combination.pop_back();}}};


原创粉丝点击