AC代码:
#include<bits/stdc++.h> using namespace std; int x[25],ans=0;//ans用来存这题的答案 int n,k; bool isprime(int a){// 判断是不是素数 for(int i=2;i*i<=a;i++){//一次剪枝,即遍历到根号下a就可以了 if(a%i==0) return false;//能被整除就一定不是素数 } return true;// 上面遍历完了都没return就一定是素数 } void dfs(int as,int sum,int start){//递归函数,核心点 //as:选到了第几个数; //sum:这些数的和; //start:从下标位为start的地方开始往下再加 if(as==k) if(isprime(sum)) {ans++;return;}//首先判断一下有没有遍历到k个数,到了就可以判断sum是不是素数了,是的话就ans++ for(int i=start;i<=n;i++){//从start开始往后加,这样就不用考虑去重的问题了。如果每次都是从1开始往后加的话,之后每次都还需要考虑一下去重的问题。 dfs(as+1,sum+x[i],i+1);//递归 } return;//全部搞完了就可以返回了 } int main(){ cin>>n>>k; for(int i=1;i<=n;i++){//输入 cin>>x[i]; } dfs(0,0,1);//初始时sum=0,as=0,start=1, //初始时,先是一个数都没选,从第一个数开始往下加 cout<<ans<<endl;; return 0; }