这是从给定的设定值和目标值
获得真或假的解决方案之一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值。如何才能获得涉及子集的元素(加在一起的集合将等于目标)?
我必须使用动态编程吗?因为我知道..递归实际上正在构建堆栈,并且在函数返回值之后,帧内的值也将被丢弃。
那么,是否可以获得与目标值相等的元素。
传递对象是问题的解决方案吗?
谢谢
答案 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);
}
}
希望这有帮助。