我正在尝试创建一个程序,给出一个数字'n'和一个数字'v'的向量,你必须尝试通过求和,减去或不使用其余来使'n'为零'v'中的数字。
这是我的算法:
bool ALG(const VectorI& v, IteratorV it, int need, int left)
{
if(it == v.end()) // No more
return false;
if (need == *it) // If I find what I need
return true;
if (left < need) // If it's impossible
return false;
else
{
int i = *it;
if(i == left) // If I'm the last one
{
if(abs(need)==abs(left) )
return true;
else
return false;
}
if( i == 0 )
return (ALG(v, ++it, need, left));
IteratorV aux = ++it;
if( ALG(v, aux, need-i, left-i) || // sum it
ALG(v, aux, need+i, left-i) || // subt it
ALG(v, aux, need, left-i) // don't use it
)
return true;
else
return false;
}
}
但是当投入很大时需要太长时间。任何人都可以帮助我加快速度吗? (或者只是另一种方式)。
编辑: 所以,我称之为:
ALG(V,v.begin(),RANDOM_NUMBER,sum_of(V));
所以,我指向第一个元素。参数'left'是Iterator到end的值之和。每次我决定如何处理迭代器指向的数字(求和,减去或没有),我运行迭代器1位置(因为我看到了这个数字)。 然后,根据我想做的事情,我会以某种方式改变“需要”(如果我想总结数字,'需要+ *它',等等)但是剩下的总是会改变,因为我有对有针对性的数字做出了决定。
向量'v'有100个数字(最大值),所有数字的总和为1000(最大值)。