标签:
洛谷1036 选数
题目描述
已知 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)
输出格式:
屏幕输出,格式为:
一个整数(满足条件的种数)。
输入输出样例
输入样例#1:
4 3
3 7 12 19
输出样例#1:
1
【思路】
回溯法+判素数。
数据很弱,与题目描述不符。
【代码】
1 #include<iostream> 2 #include<cmath> 3 using namespace std; 4 5 const int maxn = 30; 6 7 int n,k,ans; 8 int A[maxn]; 9 10 inline bool is_primes(int x) { 11 int m=sqrt(x); 12 for(int i=2;i<=m;i++) if(x%i==0) return false; 13 return true; 14 } 15 16 void dfs(int i,int d,int sum) { 17 if(d==k) { 18 if(is_primes(sum)) ans++; 19 return ; 20 } 21 if(n-i<k-d) return; //n-i<k-d 22 for(int j=i+1;j<=n;j++){ 23 dfs(j,d+1,sum+A[j]); 24 } 25 } 26 int main() { 27 ios::sync_with_stdio(false); 28 cin>>n>>k; 29 for(int i=1;i<=n;i++) cin>>A[i]; 30 dfs(0,0,0); 31 cout<<ans; 32 return 0; 33 }
标签:
原文地址:http://www.cnblogs.com/lidaxin/p/4860022.html