题目:P1036 [NOIP2002 普及组] 选数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
cpp
#include<bits/stdc++.h>
using namespace std;
int n,k;
int a[22];
long long ans;
bool isprime(int n){
for(int i=2;i<=sqrt(n);i++){
if(n%i==0) return false;
}
return true;
}
void dfs(int m,int sum,int startx){
if(m==k){ //m表选数
if(isprime(sum)) //当前的和
ans++; //符合条件加一
return ; //跳到下一循环
}
//startx表示升序排列,以免算重
for(int i=startx;i<n;i++)
dfs(m+1,sum+a[i],i+1); //递归
return ;
}
signed main(){
cin>>n>>k;
for(int i=0;i<n;i++) cin>>a[i];
dfs(0,0,0);
cout<<ans<<endl;
return 0;
}
从这道题学会的:
- 深度优先遍历(startx以免算重)
- 在dfs中return; 是指返回主函数,而主函数中有dfs(0,0,0),则此时dfs有开始重新计数;