NOIP 2002 普及组第二题
#include<bits/stdc++.h>
using namespace std;
int n,k,x[22];
int isPrime(int s){//检查是否质数,是为1,不是为0
for(int i=2;i*i<=s;i++){
if(s%i==0)
return 0;
}
return 1;
}
/*
tmpSum 目前的x个数的和(x<=k)
start 开始循环的下标
end 结束循环的下标
*/
int dfs(int k,int tmpSum,int start,int end){
if(k==0)
return isPrime(tmpSum);
int sum=0;//初始化质数个数为0
for(int i=start;i<=end;i++){
sum+=dfs(k-1,tmpSum+x[i],i+1,end);//每进行一次dfs就把k-1,表示每次tmpSum加完一个x[i]就可以少加一个; 每次循环开始位置从当前位置往后后移一位
}
return sum;
}
int main(){
cin>>n>>k;
for(int i=0;i<n;i++){
cin>>x[i];
}
cout<<dfs(k,0,0,n-1);//一开始所需要加的数组元素个数为k,此时已经相加了的元素值为0,初始开始循环的坐标为1
return 0;
}