实际上它是一个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;
}
}
};
我给了它一个想法,但想不出比这更好的复杂性。