我知道這個代碼/邏輯對於解決子集和問題是錯誤的,但似乎無法理解爲什麼。錯誤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