使用c ++进行子集和递归

时间:2012-04-06 05:43:45

标签: c++

这是从给定的设定值和目标值

获得真或假的解决方案之一
bool subsetSumExists(Set<int> & set, int target) {
    if (set.isEmpty()) {
        return target == 0;
    } else {
        int element = set.first();
        Set<int> rest = set - element;
        return subsetSumExists(rest, target)
        || (subsetSumExists(rest, target- element));
    }
}

但是,此解决方案仅返回true或false值。如何才能获得涉及子集的元素(加在一起的集合将等于目标)?

我必须使用动态编程吗?因为我知道..递归实际上正在构建堆栈,并且在函数返回值之后,帧内的值也将被丢弃。

那么,是否可以获得与目标值相等的元素。

传递对象是问题的解决方案吗?

谢谢

1 个答案:

答案 0 :(得分:5)

首先,您可以稍微优化您的程序 - 检查目标是否为0,是否始终返回true。现在你需要的是在某个地方存储你已经使用过的元素。我将向您展示一种方法,使用全局&#34;堆栈&#34;(vector实际上可以迭代它),因为这样代码将更容易理解,但您可以也可以通过引用函数传递它,或者避免以其他方式使其成为全局函数。 顺便说一句,stl容器被称为set而不是Set

vector<int> used;
bool subsetSumExists(Set<int> & set, int target) {
    if (target == 0) {
        cout << "One possible sum is:\n";
        for (int i = 0; i < used.size(); ++i) {
          cout << used[i] << endl;
        }
        return true;
    } else if(set.empty()) {
      return false;
    }else {
        int element = set.first();
        Set<int> rest = set - element;
        used.push_back(element);
        if (subsetSumExists(rest, target- element)) {
          return true;
        } else {
          used.pop_back();
        }
        return subsetSumExists(rest, target);
    }
}

希望这有帮助。