题目描述
已知 nn 个整数 x_1,x_2,…,x_nx1,x2,…,xn,以及11个整数kk(k<nk<n)。从nn个整数中任选kk个整数相加,可分别得到一系列的和。例如当n=4,k=3n=4,k=3,44个整数分别为3,7,12,193,7,12,19时,可得全部的组合与它们的和为:
3+7+12=223+7+12=22
3+7+19=293+7+19=29
7+12+19=387+12+19=38
3+12+19=343+12+19=34。
现在,要求你计算出和为素数共有多少种。
例如上例,只有一种的和为素数:3+7+19=293+7+19=29。
输入输出格式
输入格式:
键盘输入,格式为:
n,kn,k(1 le n le 20,k<n1≤n≤20,k<n)
x_1,x_2,…,x_n (1 le x_i le 5000000)x1,x2,…,xn(1≤xi≤5000000)
输出格式:
屏幕输出,格式为: 11个整数(满足条件的种数)。
输入输出样例
输出样例#1:
View Code
1
#include <iostream> using namespace std; bool isprime(int n) { if(n <=1 ) { return false; } for(int i=2; i*i<=n; i++) { if(n%i == 0) { return false; } } return true; } int n,k; int a[25]; bool visited[25]; long long ans=0; // select,已选多少个数 // sum为已选的数之和 // start,从哪个数开始选的,最初肯定是从第0个数开始选,枚举完后要从第1个数开始选 …… void dfs(int select,int sum,int start) { if(select==k) { if(isprime(sum)) { ans++; } return; } for(int i=start;i<n;i++) { if(visited[i]) { continue; } visited[i]=true; dfs(select+1,sum+a[i],i+1); visited[i]=false; } } int main() { cin>>n>>k; for(int i=0;i<n;i++) { cin>>a[i]; } dfs(0,0,0); cout<<ans; return 0; }
代码分析
递归的循环条件有两个:if条件为真,或者for循环结束。递归和循环的详细过程如下图所示(红色背景斜字体表示递归终止):