题目描述
已知 $n$ 个整数 $x_1,x_2,…,x_n$,以及$1$个整数$k$($k<n$)。从$n$个整数中任选$k$个整数相加,可分别得到一系列的和。例如当$n=4,k=3$,$4$个整数分别为$3,7,12,19$时,可得全部的组合与它们的和为:
$3+7+12=22$
$3+7+19=29$
$7+12+19=38$
$3+12+19=34$。
现在,要求你计算出和为素数共有多少种。
例如上例,只有一种的和为素数:$3+7+19=29$。
输入格式
键盘输入,格式为:
$n,k$($1 \le n \le 20,k < n$)
$x_1,x_2,…,x_n (1 \le x_i \le 5000000)$
输出格式
屏幕输出,格式为:
$1$个整数(满足条件的种数)。
输入样例
4 3
3 7 12 19
输出样例
1
题解
思路:深搜。
解释:深搜dfs函数中,sum指当前选的数的和,step指上一步选的数为a[step],num指已经选了num个数。
出口:当num=k时,已经选中k个数,判断sum的值,并退出函数。
注意:此处不需要控制step>n的情况,因为在后面for循环中i的取值会控制。
函数后部的for循环穷举下一个选中的数,并每一次都进行下一级的搜索。
#include<iostream>
using namespace std;
const int N=25;
int a[N];
int n,k;
int ans;
bool isprime(int x)
{
for(int i=2;i*i<=x;i++)
if(x % i == 0)
return 0;
return 1;
}
void dfs(int u,int sum,int last)
{
if(u == k)
{
if(isprime(sum))
ans++;
return;
}
for(int i=last;i<n;i++)
dfs(u+1,sum+a[i],i+1);
return;
}
int main(){
cin>>n>>k;
for(int i=0;i<n;i++)
cin>>a[i];
dfs(0,0,0);
cout<<ans<<endl;
return 0;
}