C++ 具有c+的子集和递归+;

C++ 具有c+的子集和递归+;,c++,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 sub

这是从给定的集合和目标值获取真或假的解决方案之一

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));
    }
}
bool subsetSumExists(Set&Set,int-target){
if(set.isEmpty()){
返回目标==0;
}否则{
int元素=set.first();
Set rest=Set-element;
返回subsetSumExists(rest,target)
||(子类存在(剩余,目标元素));
}
}
但是,此解决方案将仅返回true或false值。如何获得子集中涉及的元素(加起来等于目标的集合)呢

我必须使用动态规划吗?因为我知道。。递归实际上是在建立堆栈,函数返回值后,帧内的值也将被丢弃

那么,是否有可能得到与目标值相等的元素

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


谢谢

首先,您可以稍微优化一下程序-检查目标是否为
0
,以及它是否总是返回
true
。现在,您需要的是有一个地方来存储您已经使用过的元素。我将向您展示一种使用全局“堆栈”(事实上,这样您就可以对其进行迭代)来实现这一点的方法,因为这样代码将更容易理解,但您也可以通过引用函数来传递它,或者避免以其他方式使其全局化。 顺便说一下,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);
    }
}
使用的向量;
bool subsetSumExists(Set&Set,int-target){
如果(目标==0){
库特