【问题标题】:count all subsets of given array with sum equal to given sum计算给定数组的所有子集,总和等于给定总和
【发布时间】:2020-03-14 14:01:20
【问题描述】:

我可以做些什么来优化这段代码,如果语言是 c++,我会更容易理解。

给定一个整数数组和一个总和,任务是计算给定数组的所有子集,总和等于给定总和。 输入:arr[] = {2, 3, 5, 6, 8, 10}, sum = 10, 子集是 -> {5 2 3}, {2 8}, {10},输出:3 输入:arr[] = {1, 2, 3, 4, 5},sum = 10,子集为 -> {4 3 2 1}, {5 3 2 }, {5 4 1},输出:3)


#include<bits/stdc++.h>

using namespace std;


string binary_string(int i,int len){

    string res="";
    int mod =0;

        while(i>0){
        mod = i%2;
        res+=to_string(mod);
        i/=2;
    }

    int n = res.length();

    if(n!=len){
        while(n!=len){
            res.append("0");
            n++;

        }


         return res;
    }



    return res;
}

int main()
{
   int t;
   cin>>t;

   while(t--){
    string binary;//,subseq;
    int n,k,count=0,sum,val;
    cin>>n;

    vector<int>vect;

    for(int i=0;i<n;i++){
        cin>>k;
        vect.push_back(k);
    }
    cin>>val;


    int bits_range = (int)pow(2,n) - 1;



    //cout<<"SUBSETS ARE :"<<endl;
    for(int i=0;i<=bits_range;i++){
        binary=binary_string(i,n);
        sum=0;
        for(int i=binary.length()-1;i>=0;i--){
            if(binary[i]=='1'){
                //subseq+=to_string(vect[i]);
                sum+=vect[i];

            }

        }
        if(sum==val){
            count++;
            //cout<<subseq<<endl;
            //subseq="";
        }
        //subseq="";
    }

        cout<<count<<endl;
   }



}

【问题讨论】:

    标签: c++ string vector time-complexity bitmask


    【解决方案1】:

    您可以对数组进行排序,然后使用类似于Two-Pointer Technique 的想法。复杂度为 O(NlogN),如果可以按线性时间排序,则为线性。

    编辑: 我更好地解释我的意思。 vect现在是数组的排序版本。 partial 是子数组 [a,b) 的部分和。

    int partial = 0;
    int a = 0, b = 0;
    int count = 0;
    while (true) {
      if (partial == sum) {
        count++;
        a++;
      } else if (partial < sum) {
        if (b == vect.size()) {
          break;
        }
        partial += vect[b];
        b++;
      } else {
        partial -= vect[a];
        a++;
      }
    }
    

    注意ab都只能增加,所以循环最多有2*vect.size()迭代,所以复杂度是线性的。 在此count 之后包含答案。

    你应该检查这段代码是否正常工作,但我希望你能从中理解这个想法。

    【讨论】:

    • 但可能有满足条件的三元组,双指针只能搜索对
    • 我已经编辑了答案以更好地解释我在说什么
    • 好的,我知道了,但是您的代码在打印计数时没有产生输出,也许它正在无限循环中您可以再次检查您的代码吗
    • 找到正确子集时忘记增加a(或b,都一样)。现在应该可以了。我已经编辑了代码。我忘了说只有当数组包含正数时解决方案才有效
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-19
    • 1970-01-01
    • 2020-06-30
    • 1970-01-01
    • 1970-01-01
    • 2017-10-07
    相关资源
    最近更新 更多