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){
库特