https://leetcode.com/problems/combination-sum/
去重,自己写比用STL set处理快一些
哎,当初上交的保研复试题就是这个,这个第二题,第三题是一个不会的dp......
const int SIZE = 1000+5;
class Solution {
public:
void removeReplication(vector <int>& candidates) {
vector <int> old(candidates);
candidates.clear();
if(old.size() == 0)return ;
int pre = old[0];
candidates.push_back(pre);
for(int i=1;i<old.size();i++) {
if(old[i] != pre) {
candidates.push_back(old[i]);
pre = old[i];
}
}
}
vector< vector<int> > combinationSum(vector<int>& candidates, int target) {
ans.clear();
sort(candidates.begin(), candidates.end());
removeReplication(candidates);
for(int i=0;i<candidates.size();i++)
cnt[i] = 0;
dfs(0,target, 0, candidates);
return ans;
}
void dfs(int now, int target, int ptr, vector<int>& candidates) {
if(now == target) {
vector <int> ivec;//(cnt, cnt+candidates.size());
for(int i=0;i<ptr;i++) {
for(int j=0;j<cnt[i];j++)
ivec.push_back(candidates[i]);
}
if(ans.size() == 0) {
ans.push_back(ivec);
} else {
if(ivec != ans[ans.size()-1])ans.push_back(ivec);
}
return;
}
if(ptr >= candidates.size()|| now > target) return;
int up = (target-now)/candidates[ptr];
for(int i=0;i<=up;i++) {
cnt[ptr] = i;
dfs(now+i*candidates[ptr], target, ptr+1, candidates);
cnt[ptr] = 0;
}
}
int cnt[SIZE];
vector < vector<int> > ans;
};