1008 选数(深搜 判断素数)

    xiaoxiao2021-03-25  67

    题目描述 Description

    已知 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 Input

    4 3 3 7 12 19

    样例输出 Sample Output

    1

    数据范围及提示 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; }

    转载请注明原文地址: https://ju.6miu.com/read-32980.html

    最新回复(0)