【问题标题】:How do you find a subarray with the given sum? [duplicate]你如何找到一个给定总和的子数组? [复制]
【发布时间】:2021-11-25 13:21:08
【问题描述】:
我得到一个元素数组和总和 K,我应该找到一个总和等于 K 的子数组(不必是连续的)。
例如:
输入:[1, 9, 3, 2, 21], 30
输出:[9, 21]
我是否需要使用回溯,或者是否有其他算法使用动态规划?
【问题讨论】:
标签:
python
algorithm
subset-sum
【解决方案1】:
如果它不是一个大数组,您可以使用蛮力:2^n 解决方案!
【解决方案2】:
我可以使用 C++ 提供解决方案。
//Input: [1, 9, 3, 2, 21],
//resultingSum=30,
//Output: [9, 21].
#include <iostream>
#include <vector>
#include <set>
using namespace std;
const int maximumSize=40;
vector<int> visited(maximumSize, 0);
vector<int> numbers={1, 9, 3, 2, 21};
int resultingSum=30;
set<int> resultingSet;
void showContentVector(vector<int>& input)
{
for(int i=0; i<input.size(); ++i)
{
cout<<input[i]<<", ";
}
}
void showContentSet(set<int>& input)
{
for(auto iterator=input.begin(); iterator!=input.end(); ++iterator)
{
cout<<*iterator<<", ";
}
return;
}
void dfs(int current, int previous)
{
if(visited[current]==1)
{
return;
}
visited[current]=1;
for(int next=0; next<numbers.size(); ++next)
{
if(next==current)
{
continue;
}
if((numbers[current]+numbers[next])==resultingSum)
{
resultingSet.insert(numbers[current]);
resultingSet.insert(numbers[next]);
}
}
for(int next=(current+1); next<numbers.size(); ++next)
{
if(next==previous)
{
continue;
}
dfs(next, current);
}
return;
}
int main()
{
dfs(0, -1);
showContentSet(resultingSet);
return 0;
}
结果如下:
9, 21,