题目链接: ~传送门~
代码:
#include <iostream>
#include <math.h>
using namespace std;
int vis[25];
int a[25];
int ans;
int n,k;
bool isPrime(int n){//判断是否素数
int s=sqrt(double(n));
for(int i=2;i<=s;i++)
{
if(n%i==0)
return false;
}
return true;
}
void dfs(int m,int sum,int start)
{//m代表当前选择了几个数
if(m==k)
{
if(isPrime(sum))//符合要求
ans++;//答案加一
return ;
}
for(int i=start;i<n;i++)
{
if(vis[i])//已经被选过
continue;
vis[i]=1;//标记已经选过
dfs(m+1,sum+a[i],i+1);//强大的递归
vis[i]=0;//恢复标记
}
return ;
}
int main()
{
cin>>n>>k;
for(int i=0;i<n;i++)
cin>>a[i];
dfs(0,0,0);
cout<<ans;
return 0;
}