与子集和类似

时间:2015-04-20 09:00:59

标签: c++ algorithm subset-sum

实际上它是一个topcoder 500pt问题。我得到了一个正数向量,我被要求找到无法获得的最小正整数X作为S的某些(可能是所有)元素的总和。数组的大小小于20,每个元素都适合整数。

例如

 {5, 1, 2}
 Returns: 4
 These are all the positive integers that can be obtained: 1, 2, 3, 5, 6,7, 
 and 8. (We can obtain 3 as 1+2, 6 as 1+5, 7 as 2+5, and 8 as 1+2+5.)   
 The smallest positive integer not present in the above list is 4.

我能用458.62pts做这个问题。但在某些情况下我得到了TLE。我知道这是 O(n * 2 ^ n)

我的方法

   class NumbersChallenge
  {
   public:
   int MinNumber(vector<int>&v)
   {
     int max=0;
     for(int i=0;i<v.size();++i)max+=v[i];
     for(int i=1;i<max;i++)
      { 
        int flag=0;
        for(int j=0;j<pow(2,v.size());j++)
        { 
            int sum=0;
            for(int k=0;k<v.size();k++)
            {
              if(j&(1<<k))
              sum+=v[k];
            }
          if(sum==i)flag=1;
        }
     if(flag==0)
     return i;
   }
  }
};

我给了它一个想法,但想不出比这更好的复杂性。

0 个答案:

没有答案