caioj1033:递归3(组合+判断素数)

【闲话】挨了个代码出来然后输出一直是0检查了一个小时才发现问题 emmm中途内心是崩溃的 最后发现又是没有在循环内初始化累加和 qwq 不过发现了很多需要注意的东西

1.判断质数 取平方根是sqrt(x+1) 循环从i=2开始 (老习惯写成1qwq 1是任何数的因数啊喂!!!!

2.初始化 初始化 初始化

3.学到了一个求和的东西(....虽然老师说不用管但是就是自己写求和的时候写错了qwq)t=accumulate(b+1,b+r+1,0); b数组下标1~r求和 0是起始值!!!!!!!!!!!0000000000000000自己写不要忘了0啊啊啊啊啊(够)                               头文件#include

4.一个英文单词/doge prime number:素数

【题意】

已知 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。 
【输入格式】 
第一行两个整数:n , k (1<=n<=20,k<n) 
第二行n个整数:x1,x2,…,xn (1<=xi<=5000000) 
【输出格式】 
一个整数(满足条件的方案数)。
【样例输入】
4 3
3 7 12 19
【样例输出】

1

【代码】

//i数组下标 第一个数后至少r-k个数 
//第k个位置放a[i]  j:开始选的第一个数 a数组中第j个数作为k位置第一个选项 
//搜索有范围  保证j后有足够的数 
#include
#include//#include
using namespace std;
int n,r,a[25],b[25],s,ans;

bool isss(int x){
	if (x<2) return false;
	int k = sqrt(x);
	for (int i=2;i<=k;i++)//2开始 
		if (x%i==0)
			return false;
	return true;
}
void dfs(int k,int j){
	if(k==r+1)
	{   s=0;//初始化!!!!  
		for(int i=1;i<=r;i++) s+=b[i];//t=accumulate(b+1,b+r+1,0);	
		if(isss(s)) ans++;
	    return ;
	}
	for(int i=j;i+r-k<=n;i++)
	{
		b[k]=a[i];
		dfs(k+1,i+1);//第k个数是a[i] 第k+1个数至少a[i+1] 
	}
}
int main(){
	scanf("%d%d",&n,&r);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	dfs(1,1);
	printf("%d",ans);
	return 0;
} 

你可能感兴趣的:(递归)