已知 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)
x1,x2,…,xn (1<=xi<=5000000)
输出格式:
屏幕输出,格式为:
一个整数(满足条件的种数)。
#include<bits/stdc++.h>//万能头文件 using namespace std; int ans,n,k,a[50],i; bool check(int a)//判断质数(a即为选择的k个数之和) { int i; if(a<2) return false; for(i=2;i<=sqrt(a);i++) if(a%i==0) return false; return true; } void dfs(int num,int i,int sum)//(num表示已选数的个数,i表示下一个要枚举的数的位置,sum表示选数之和) { if(num==k)//当选了k个数时 { if(check(sum)) ++ans;//if所选数加起来是质数,ans累加 return; //回溯 } for(i;i<=n;i++)//只有这两行才是核心代码(其实就是一个暴力,相当于n个数中枚举k个元素的集合) dfs(num+1,i+1,sum+a[i]);//以i向后枚举,由于前一步处理了边界,这里不需担心会超过k个数 } int main() { cin>>n; cin>>k; for(i=1;i<=n;i++) cin>>a[i]; dfs(0,1,0);//(从0个数开始,下一步枚举第一个数,累加器暂时为0) cout<<ans;//完美输出结果 return 0; }
原文:https://www.cnblogs.com/zhouzhihao/p/9874026.html