深搜专题7:最大质数
描述
给定一个正整数的序列,从中选出若干个数字,使它们的和为质数,请找出其中最大的一个质数。如果不存在任何组合的和为质数,则输出“NO”。
输入描述
一个整数 N (5 <= N <= 20)。
接下来是一行正整数,共计 N 个,每个正整数的大小都不超过20。
输出描述
输出最大的质数。
如果不存在任何组合的和为质数,则输出“NO”。
同样比较简单。
#include <bits/stdc++.h>
using namespace std;
int n,mx=-1,sum,a[30],vis[30];
bool ck(int e){//质数的判断
if(e<2)return 0;
for(int i=2;i<=e/i;i++){
if(e%i==0)return false;
}
return true;
}
void dfs(int x,int sum){
if(ck(sum)){
mx=max(mx,sum);
}
for(int i=x+1;i<=n;i++){
sum+=a[i];//加上此位置的数
vis[i]=1;//标记此数已被纳入
dfs(i,sum);
vis[i]=0;
sum-=a[i];//回溯
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
dfs(0,0);
if(mx>0)cout<<mx;
else cout<<"NO";
}