输出数组中和为某个整数的所有组合

擦,花了很久才调成功,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;
}

 

posted @ 2013-09-13 01:37  dmthinker  阅读(590)  评论(0)    收藏  举报