#include<stdio.h>
#include<math.h>
int v[25];
int ans=0;
int a,b;
int judge(int n);
void dfs(int step,int sum,int num);
int main(void){
scanf("%d%d",&a,&b);
for(int i=1;i<=a;i++){
scanf("%d",&v[i]);
}
dfs(1,0,0);
printf("%d",ans);
return 0;
}
int judge(int n){
if(n==1){
return 0;
}
if(n==2||n==3){
return 1;
}
if(n%6!=1&&n%6!=5){
return 0;
}else{
for(int i=2;i<=sqrt(n);i++){
if(n%i==0){
return 0;
}
}
return 1;
}
}
//每个数只有选与不选,因此只要以此递归,
void dfs(int step,int sum,int num){
//step判断了几个数
//sun目前的和
//num已经选了几个数
if(num==b){//已经选了三个数,判断返回
if(judge(sum)){
ans++;
}
return;
}
if(step==a+1){//已经是最后一个数,直接返回
return;
}
dfs(step+1,sum+v[step],num+1);//选了下标为step的数
dfs(step+1,sum,num);//没有选下标为step的数
}
这是我之前做的一道题的思路,这里也适用,如果可以改进,希望大家指出(我只是刚玩洛谷几天的蒟蒻)