void dfsSearch(vector<int> &subset, vector<vector<int>> &ans, vector<pair<int, int>> &numbers, int curPtr) { if (curPtr==numbers.size()) { ans.push_back(subset); return; } dfsSearch(subset, ans, numbers, curPtr+1); for (int i=1; i<=numbers[curPtr].second; ++i) { subset.push_back(numbers[curPtr].first); dfsSearch(subset, ans, numbers, curPtr+1); } for (int i=0; i<numbers[curPtr].second; ++i) subset.pop_back(); }
void ida(){ //起始状态就是目标状态 DEPTH = (hfunc()+2)/3; while(DEPTH < 5 && dfsSearch(1))DEPTH++; if(DEPTH == 5){ printf("5 or more\n"); } else{ printf("%d\n",DEPTH); } }
vector<vector<int>> subsetsWithDup(vector<int> &nums) { sort(nums.begin(), nums.end()); vector<pair<int, int>> numbers; int start = 0; while (start<nums.size()) { int end = start+1; while (end<nums.size() && nums[end]==nums[start]) ++end; numbers.push_back(make_pair(nums[start], end-start)); start = end; } vector<vector<int>> ans; vector<int> subset; dfsSearch(subset, ans, numbers, 0); return ans; }
bool dfsSearch( int currDepth) { int x1,x2,x3,h; for(x1=0;x1<n-1;x1++){ for(x2=x1;x2<n-1;x2++){ for(x3=x2+1;x3<n;x3++){ changeState(x1,x2,x3); h=hfunc(); if(h==0)return false; else if(3*currDepth + h <= 3*DEPTH){ if(!dfsSearch(currDepth+1))return false; } changeState(x1,x1-x2+x3-1,x3); } } } return true ; }