我知道这个代码/逻辑对于解决子集和问题是错误的,但似乎无法理解为什么。错误Subset sum in O(n^2)
计算所有可能的子集的总和,并检查是否有任何等于所需的总和。这将在O(n^2)中完成,这显然是错误的,因为我可以通过DP O(n * sum)解决这个问题。
谢谢。
int main() {
long long int t,n,i,j;
scanf("%lld",&t);
while(t--)
{
long long int p[1005][1005],s[1005][1005]={0};
long long int a[1005],sum;
long long int counter=0;
scanf("%lld %lld",&n,&sum);
for(i=0;i<n;i++)
scanf("%lld",&a[i]);
s[0][0]=a[0];
for(i=0;i<n;i++)
{
for(j=i;j<n;j++)
{
if(i==j)
{
s[i][j]=a[i];
}
else
{
s[i][j]=a[j]+s[i][j-1];
}
}
}
int flag=0;
for(i=0;i<n;i++)
{
for(j=i;j<n;j++)
{
if(s[i][j]==sum)
flag++;
}
}
if(flag)
cout<<1<<endl;
else
cout<<0<<endl;
}
return 0;
}
代码在哪里? – AndyG
另外,子集和是NP完成的。如果你能以比所有问题实例的指数时间更快的速度解决问题,那么你将赢得各种奖品。 – AndyG
我知道这是错误的,我只是要求逻辑上的缺陷。 – someone1