递归判断即可。素数的地方可能处理的不是很到位。
#include <cstdio>
#include <cmath>
using namespace std;
#define MAX_NUM 150
typedef struct
{
int num ;
int visited;
}T ;
T data[MAX_NUM];
int max = -1;
bool is_prime(int num)
{
int i = 0 ;
for( i = 2 ; i*i <= num; i++)
{
if(num%i==0)
{
return false ;
}
}
return true;
}
void do_find(int len , int count)
{
int i , j ;
int a ;
if( count>max)
{
max = count ;
}
for( i = 0 ; i < len ; i++)
{
if( data[i].visited == 0)
{
data[i].visited = 1 ;
a = data[i].num ;
for( j = 0 ; j <len ; j++ )
{
if(data[j].visited == 0 && is_prime( a +data[j].num))
{
data[j].visited = 1 ;
do_find(len , count+1);
data[j].visited = 0 ;
}
}
data[i].visited = 0 ;
}
}
return ;
}
int main(void)
{
int N ;
int i ;
//freopen("input.txt" , "r" , stdin);
//freopen("output.txt" , "w" , stdout);
scanf("%d" , &N);
for( i = 0 ; i<N ; i++)
{
int t ;
scanf("%d" , &t);
data[i].num = t ;
}
do_find(N , 0);
printf("%d\n" , max);
return 0 ;
}