已知 n 个整数 x1,x2,…,xn,以及一个整数 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)。
输入描述 Input Description键盘输入,格式为: n , k (1<=n<=20,k<n) x1,x2,…,xn (1<=xi<=5000000)
输出描述 Output Description屏幕输出,格式为: 一个整数(满足条件的种数)。
样例输入 Sample Input4 3 3 7 12 19
样例输出 Sample Output1
数据范围及提示 Data Size & Hint(1<=n<=20,k<n) (1<=xi<=5000000)
思路:从n个数找出k个,判断这k个数之和是否为素数
代码:
#include<iostream> #include<algorithm> using namespace std; long long n,k,a[21],b[21]={0},v[21]={0},cnt=0; int check(long long sum) { long long i,j; for (i=2; i*i<=sum; i++) { if (sum%i == 0) { return 0; } } return 1; } void dfs(long long x, long long sum, long long s) { int i,j; if (x == k) { if (check(sum)) //判断是否是素数 { cnt++; } return ; } for (i=s; i<n; i++) { if (!v[i]) { b[x] = a[i]; sum += b[x]; v[i] = 1; dfs(x+1,sum,i+1); sum -= b[x]; v[i] = 0; } } } int main() { long long i; cin>>n>>k; for (i=0; i<n; i++) { cin>>a[i]; } dfs(0,0,0); cout<<cnt; return 0; }