基于问题C:【递归入门】组合的素数判定
主题描述已知的n个整数b1、b2、bn
且整数k(k<; n )。
将n个整数与任意k个整数相加,分别得到一系列的和。
例如,在n=4、k=3、4个整数分别为3、7、12、19情况下,所有的组合和它们之和如下
3 7 12=223 7 19=297 12 19=383 12 19=34。
现在,请计算一下质数和有多少种。
例如,只有一种之和是素数。 三七十九等于二十九。
输入第一行的两个整数。 n,k(1=n=20,k<; n ) )。
第二行中的n个整数: x1,x2,xn(1=Xi=5000000 ) )。
输出整数(满足条件的方案数)。
样本输入4 33 7 12 19样本输出1采用深度优先搜索递归的思路进行遍历。 从n个中选择k个,将n个收纳在一个排列中。 递归死胡同选择个数达到k个,选择后将该k个相加,判断对和是否为素数,若为,统计量加1。
因此,递归函数DFS有三个参数。 索引是索引号的数量,nowK是当前选择的数量,sum是当前选择的数量之和。
参考代码:
#include cstdioint n,k,p[22]; int count; OOLisprime(intc ) if ) C2 )返回假; for(intI=2; i*i=c; I ) if(c%I==0)返回假; }return true; }voidDFS(intindex,int nowk,int sum ) if ) nowk==k ) if ) isprime ) sum ) /素数时,统计量为1count; 返回; }if(index==n|||nowkk )/n个处理完毕或超过k个时,返回return; DFS (索引1,nowk 1,sum p [索引] ); //选择当前数量DFS (索引1,nowk,sum ); //不选择当前数量(}int main ) ) {count=0; scanf('%d%d ),n,k ); for(intI=0; in; I ) scanf('%d ',p[i]; } DFS (0,0,0 ); printf(%d(n ),count ); 返回0; }