输出数组中和为某个整数的所有组合
擦,花了很久才调成功,push_back放到了循环外,真tm想抽自己,烦躁!
先排序再做,效率会比较高,同时避免输出重复,对于重复数字,如果有n个重复数字,使用dp就是从包含0个到包含n个该数字的所有组合。
// 输出数组中和为某个整数的所有组合 #include <iostream> #include <algorithm> #include <vector> using namespace std; void Print(const vector<int>& arr) { for (int i = 0; i < arr.size(); ++i) cout << arr[i] << "\t"; } vector<vector<int> > Process(const vector<int>& arr, int pos, int sum) { vector<vector<int> > results; if (pos >= arr.size() || (arr[pos] >= 0 && sum < arr[pos])) return results; int len = arr.size(); int same_num = 0; int i = pos; while (arr[pos] == arr[i] && i < len) { same_num++; i++; } for (int k = 0; k <= same_num; ++k) { vector<int> result; result.resize(k, arr[pos]); if (sum == k*arr[pos]) { if (k != 0) results.push_back(result); } vector<vector<int> > part_results; part_results = Process(arr, pos + same_num, sum - k*arr[pos]); if (part_results.empty()) continue; for (int m = 0; m < part_results.size(); ++m) { result.resize(k, arr[pos]); result.insert(result.end(), part_results[m].begin(), part_results[m].end()); results.push_back(result); } } return results; } vector<vector<int> > GetAllMatchedSubSequence(vector<int>& arr, int sum) { vector<vector<int> > results; if (arr.empty()) return results; sort(arr.begin(), arr.end()); return Process(arr, 0, sum); } int main() { int arr[] = {3,1,3,1,4,2,2,2,0,0,0,0,4,4,4,5,1,1,1,1,7,7,7,6,2,3,-1,-1,-1,-2,-3,-2,-3}; vector<int> v_arr; v_arr.assign(arr, arr + sizeof(arr)/4); vector<vector<int> > results; results = GetAllMatchedSubSequence(v_arr, 10); for (int i = 0; i < results.size(); ++i) { for (int j = 0; j < results[i].size(); ++j) { cout << results[i][j] << "\t"; } cout << endl; } return 1; }
Passion, patience, perseverance, keep it and move on.

浙公网安备 33010602011771号