Use sets to keep unique and Binary Form 1111 to the possible results. The code is :
#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
using namespace std;
class Solution {
public:
set<double> status[16];
typedef set<double>::iterator ITER;
void f(int x, vector<int>& vec) {
for (int i = 1; i <= x / 2; ++i) {
if ((x & i) == i) {
for (ITER j = status[i].begin(); j != status[i].end(); ++j)
for (ITER k = status[x-i].begin(); k != status[x-i].end(); ++k) {
status[x].insert((*j) * (*k));
status[x].insert((*j) + (*k));
status[x].insert((*j) - (*k));
status[x].insert((*k) - (*j));
if ((*k) != 0)
status[x].insert((*j) / (*k));
if ((*j) != 0)
status[x].insert((*k) / (*j));
}
}
}
}
void init(const vector<int>& vec) {
for (int i = 0; i < vec.size(); ++i)
status[(1 << i)].insert((double)vec[i]);
}
bool getSum24(vector<int>& vec) {
init(vec);
for (int i = 1; i <= 15; ++i)
f(i, vec);
return status[15].find(24) != status[15].end() ? true : false;
}
};
int main() {
int a[] = {1, 1, 1, 1};
Solution s;
vector<int> vec(a, a+4);
bool res = s.getSum24(vec);
return 0;
}原文:http://blog.csdn.net/taoqick/article/details/23393487