【发布时间】:2021-03-26 05:46:58
【问题描述】:
我得到一个整数向量和一个总和,如果该总和可以从该向量中元素的任何组合生成,我需要返回该组合。如果可能有不止一种这样的组合,我可以返回任何一种。
例如,
sum = 20,vector = {6,25,8},我们可以将 8 6 6 打印为 8+6+6 = 20
sum = 10,vector = {4,6,7},我们可以将 6 4 打印为 6+4 = 10
sum = 15,vector = {8,4,5},我们可以将 5 5 5 打印为 5+5+5 = 15
问题:上面的最后两个例子工作正常,但第一个没有。原因是,如果您为第一个示例绘制递归树,那么根据我的代码,您会得到 flag 变量 true,因为在同一父节点下存在多个 targetSum = 0 的基本情况。因此,最后一个示例打印 8 6 6 8 6。
我的问题是,因为我只需要打印任何可能的组合,加起来targetSum,我可以跳过递归树的其他分支吗?基本上,一旦我们达到targetSum = 0 的基本情况,我们就会上树并打印出序列?那可能吗 ? (我已尝试为此使用stackCount,但它只会阻止根节点的右侧子节点在找到总和为targetSum 的序列时执行。)如果没有,请告诉我如何或修改此代码中的内容以使其正常工作。
#include <iostream>
#include <vector>
#include <map>
using namespace std;
bool howSum(int &targetSum, vector<int> &elementVector, vector<int> &howSumVector, map<int, bool> &memo, int &stackCount) {
stackCount++;
if (memo.find(targetSum) != memo.end())
return memo[targetSum];
else if (targetSum == 0)
return true;
else if (targetSum < 0)
return false;
else {
for (auto i : elementVector) {
int remainder = targetSum - i;
bool flag = howSum(remainder, elementVector, howSumVector, memo, stackCount);
stackCount--;
if (flag) {
howSumVector.push_back(i);
memo[targetSum] = true;
} else if(memo.find(targetSum) == memo.end())
memo[targetSum] = false;
if(stackCount == 1 && !howSumVector.empty())
return true;
}
return memo[targetSum];
}
}
int main() {
int stackCount = 0;
int sum = 20; // test cases 20,10,15
map<int, bool> memo;
vector<int> elements = {6,25,8}; // test cases {6,25,8},{4,6,7},{8,4,5}
vector<int> workingBench = {};
howSum(sum, elements, workingBench, memo, stackCount);
for (auto i : workingBench)
cout << i << " ";
}
【问题讨论】:
标签: c++ recursion dynamic-programming