P1036 [NOIP2002 普及组] 选数 (判断素数,dfs)
下为代码
主要涉及到判断素数和dfs两个知识点
判断素数的模板
int isprime(int n) { if(n <= 1) return 0; for(int i = 2; i * i <= n; i++){ if(n % i == 0) return 0; } return 1; }
dfs
重点理解这里的dfs,借助样例理解。
void dfs(int dep,int k1,int sum){//depth深度初始为1 //以样例为例子,我们要拿三个数的和,k1用来判断是否到达3 //sum是这三个数的和,初始为0 if(dep == n + 1)//到达最深处的下一个就判断一次 { if(k1 != k) return; //加的数不到三个则返回到上一次dfs if(isprime(sum)) ans++; return; } dfs(dep+1,k1+1,sum+x[dep]); //若选了这数,则将它加上,深度加一,选的数的数目加一 dfs(dep+1,k1,sum); //若没选这个数,就不加,深度加一,选的数的数目不变 }
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
int x[30];
int n,k;
int ans = 0;
int isprime(int n)
{
if(n <= 1) return 0;
for(int i = 2; i * i <= n; i++){
if(n % i == 0) return 0;
}
return 1;
}
void dfs(int dep,int k1,int sum){//depth深度初始为1
//以样例为例子,我们要拿三个数的和,k1用来判断是否到达3
//sum是这三个数的和,初始为0
if(dep == n + 1)//到达最深处的下一个就判断一次
{
if(k1 != k) return;
//加的数不到三个则返回到上一次dfs
if(isprime(sum)) ans++;
return;
}
dfs(dep+1,k1+1,sum+x[dep]);
//若选了这数,则将它加上,深度加一,选的数的数目加一
dfs(dep+1,k1,sum);
//若没选这个数,就不加,深度加一,选的数的数目不变
}
int main(){
cin >> n >> k;
for(int i = 1; i <= n; i++) cin >> x[i];
dfs(1,0,0);//从一开始深度搜索
cout << ans << '\n';
return 0;
}