【问题标题】: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]

我是否需要使用回溯,或者是否有其他算法使用动态规划?

【问题讨论】:

  • 欢迎来到Stack Overflow. 请注意这不是代码编写或辅导服务。我们可以帮助解决具体的技术问题,而不是对代码或建议的开放式请求。请编辑您的问题以显示您迄今为止尝试过的内容,以及您需要帮助的具体问题。请参阅How To Ask a Good Question 页面,详细了解如何最好地帮助我们。
  • 看看这个维基百科页面:en.wikipedia.org/wiki/Subset_sum_problem

标签: 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, 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-03
      • 1970-01-01
      • 2020-06-30
      • 1970-01-01
      • 1970-01-01
      • 2015-08-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多