在DFS里,如果写一个正常的for循环的话,那么就会超时。看代码就可以发现了
题目地址:
点击打开链接
一开始没有打表质数,所以直接TE了,后来改了还是TE,后来发现应该在加入的时候就进行减枝,不然只要满足个数都会来一次判断,就是N!级别的了,肯定会超时。
代码:
#include<iostream>
#include<cstdio>
#include<string.h>
using namespace std ;
int N ;
int Rem[30];
int Prime[50];
bool isPrime( int b )
{
for(int i =2 ; i*i<=b ; i ++)
{
if(b%i==0)
return false ;
}
return true ;
}
bool isRight(){
if(!Prime[Rem[0]+Rem[N-1]])
return false ;
/* for(int i= 0 ; i <N-1 ; i ++)
{
if(!Prime[Rem[i]+Rem[i+1]])
{
return false ;
}
}*/
return true ;
}
int Vis[50];
void dfs(int Count){
if(Count == N)
{
if(isRight())
{
for(int i = 0 ; i < N-1 ; i ++)
{
printf("%d ",Rem[i]);
}
printf("%d\n",Rem[N-1]);
}
return ;
}
for(int i = 2 ; i <=N ; i ++ )
{
if(!Vis[i]&&Prime[i+Rem[Count-1]])
{
Vis[i]=1;
Rem[Count]=i;
dfs(Count+1);
Vis[i]=0;
}
}
}
int main(){
for(int i = 2 ; i <50 ; i ++)
{
if(isPrime(i))
Prime[i]=1;
else
Prime[i]=0;
}
int index = 1 ;
while(~scanf("%d",&N))
{
printf("Case %d:\n",index++);
memset(Vis,0,sizeof(Vis));
Vis[1]= 1 ;
Rem[0]= 1 ;
dfs(1);
printf("\n");
}
}