作者:
晚于: 2020-07-29 12:00:00后提交分数乘系数50%
截止日期: 2020-08-05 12:00:00
问题描述 :
给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合,输出组合的数量。
candidates 中的每个数字在每个组合中只能使用一次。
说明:
所有数字(包括目标数)都是正整数。
解集不能包含重复的组合。
示例 1:
输入: candidates = [10,1,2,7,6,1,5], target = 8,
所求解集为:
[
[1, 7],
[1, 2, 5],
[2, 6],
[1, 1, 6]
]
输出:4
示例 2:
输入: candidates = [2,5,2,1,2], target = 5,
所求解集为:
[
[1,2,2],
[5]
]
输出:2
可使用以下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().combinationSum2(candidates,target);
cout<<res.size()<<endl;
return 0;
}
输入说明 :
首先输入candidates数组的长度n,
然后输入n个整数,以空格分隔。
最后输入target 。
1 <= n <= 60
1 <= candidates[i] <= 100 candidates 中的元素存在重复。
1 <= target <= 100
输出说明 :
输出一个整数
输入范例 :
输出范例 :
#include <iostream> #include <vector> #include <algorithm> using namespace std; class Solution { private: vector<int> candidates; public: void dfs(vector<vector<int>>& res,vector<int> &candidates,vector<int> &temp,int start, int target) { if (target == 0) { res.push_back(temp); return; } for (int i = start; i < candidates.size() && target - candidates[i] >= 0; i++) { if (i > start && candidates[i] == candidates[i - 1])//递归的同时进行去重 continue; temp.push_back(candidates[i]); // 元素不可重复利用,使用下一个即i+1 dfs(res,candidates,temp,i + 1, target - candidates[i]); temp.pop_back(); /* for(int j=0;j<temp.size();j++) cout<<"temp"<<temp[j]<<" "; cout<<" i "<<i<<" target "<<target<<" start "<<start<<endl;*/ } } vector<vector<int>> combinationSum2(vector<int> &candidates, int target) { sort(candidates.begin(), candidates.end());//排序方便剪枝 vector<vector<int>> res; vector<int> temp; dfs(res,candidates,temp,0, target); return res; } }; 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().combinationSum2(candidates,target); cout<<res.size()<<endl; return 0; }