瞎逛时看到这个题目。想来很久没有做算法题了,觉得本题好像挺好玩的,所以抓来练手。
解释下题目,比如集合{1,2,3,4,5},和为5的子集有{1,4},{2,3},{5}。这个问题有点类似Subset sumproblem,可参考(http://en.wikipedia.org/wiki/Subset_sum_problem)
不过我没有想到文中那些聪明的做法,还是祭出万金油:回溯(其实应该是回溯+剪枝,但没想出剪枝算法)。这玩意的时间复杂度可是2^N。
static bool possible(int* data, int size, int target)
{
int min = 0;
int max = 0;
for (int i = 0; i < size; ++i)
{
if (data[i] >=0)
{
max +=data[i];
}
else
{
min +=data[i];
}
}
return (target >= min&& target <=max);
}
class RecursiveSolution0
{
public:
staticpair<int,int> solute(int* data, intsize, int target, bool print)
{
if (data == NULL || size<= 0)
{
throwstd::runtime_error("");
}
int* elements = newint[size];
int element_cnt = 0;
int solution_cnt = 0;
int compare_times = 0;
if (possible(data, size,target))
{
outputSubsetRecursive(data, size, print, 0, target, elements,element_cnt, solution_cnt, compare_times);
}
delete[] elements;
returnstd::make_pair<int,int>(solution_cnt, compare_times);
}
private:
static void outputSubsetRecursive(int* data, intsize, bool print, int begin, int target,
int* elements,int& element_cnt, int&solution_cnt, int& compare_times)
{
for (int i = begin; i< size; ++ i)
{
++compare_times;
if(data[i] == target)
{