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

来源:互联网 发布:女生滴风油精知乎 编辑:程序博客网 时间:2024/06/14 11:24

【闲话】挨了个代码出来然后输出一直是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<numeric>

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<cstdio>#include<cmath>//#include<numeric>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;} 

原创粉丝点击