力扣练习——34 组合总和
1.问题描述
给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合,输出组合的数量。
candidates 中的数字可以无限制重复被选取。
说明:
所有数字(包括 target)都是正整数。
解集不能包含重复的组合。
示例 1:
输入:candidates = [2,3,6,7], target = 7,
所求解集为:
[
[7],
[2,2,3]
]
输出:2
示例 2:
输入:candidates = [2,3,5], target = 8,
所求解集为:
[
[2,2,2,2],
[2,3,3],
[3,5]
]
输出:3
可使用以下main函数:
int main()
{
int n,data,target;
vector<int> candidates;
cin>>n;
for(int i=0; i<n; i++)
{
cin>>data;
candidates.push_back(data);
}
cin>>target;
vector<vector<int> > res=Solution().combinationSum(candidates,target);
cout<<res.size()<<endl;
return 0;
}
2.输入说明
首先输入candidates数组的长度n,
然后输入n个整数,以空格分隔。
最后输入target 。
1 <= n <= 30
1 <= candidates[i] <= 100 candidates 中的每个元素都是独一无二的。
1 <= target <= 100
3.输出说明
输出一个整数
4.范例
输入
3
2 3 5
8
输出
3
5.代码
#include<iostream> #include<algorithm> #include<string> #include<vector> using namespace std; //1.进行搜索回溯,其中对于candidates数组,用idx表示当前遍历的数组下标,数组combine用来表示已经组合的列表,ans用来返回最后的结果,目前还有target需要组合 void dfs(vector<int>& candidates, int target, vector<vector<int>>& ans, vector<int>& combine, int index) { //1.终止条件1:访问完所有数组 if (index == candidates.size()) { return; } //2.需要进行组合的target已经为0 if (target == 0) { ans.push_back(combine); //ans.emplace_back(combine);//将已经组合的列表combine插入到ans //push_back()方法要调用构造函数和复制构造函数,先构造一个临时对象,然后把临时的copy构造函数拷贝或者移动到容器最后面。 //emplace_back()在实现时,则是直接在容器的尾部创建这个元素,省去了拷贝或移动元素的过程。 return; } // 直接跳过当前被遍历的元素,跳到下一个元素 dfs(candidates, target, ans, combine, index + 1); // 选择当前被遍历的元素 if (target - candidates[index] >= 0) { combine.emplace_back(candidates[index]); dfs(candidates, target - candidates[index], ans, combine, index);//回溯过程 combine.pop_back();//注意这里的操作 } } vector<vector<int>> combinationSum(vector<int>& candidates, int target) { vector<vector<int>> ans;//结果数组 vector<int> combine;//已经组合的列表 dfs(candidates, target, ans, combine, 0); return ans; } int main() { int n, data, target; vector<int> candidates; cin >> n; for (int i = 0; i < n; i++) { cin >> data; candidates.push_back(data); } cin >> target; vector<vector<int> > res = combinationSum(candidates, target); cout << res.size() << endl; return 0; }