1008 选数
2002年NOIP全国联赛普及组
时间限制: 1 s
空间限制: 128000 KB
题目等级 : 黄金 Gold
题目描述 Description
已知 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)。
输入描述 Input Description
键盘输入,格式为:
n , k (1<=n<=20,k<n)
x1,x2,…,xn (1<=xi<=5000000)
输出描述 Output Description
屏幕输出,格式为:
一个整数(满足条件的种数)。
样例输入 Sample Input
4 3
3 7 12 19
样例输出 Sample Output
1
数据范围及提示 Data Size & Hint
(1<=n<=20,k<n)
(1<=xi<=5000000)
思路:深搜。
1 #include<iostream> 2 using namespace std; 3 #include<cmath> 4 #include<cstring> 5 int n,k; 6 int sum,ans; 7 int num[30]; 8 bool vis[30]; 9 bool pd(int a) 10 { 11 for(int i=2;i<=sqrt(a);++i) 12 if(a%i==0)return false ; 13 return true; 14 } 15 void dfs(int a,int s) 16 { 17 if(s==k) 18 { 19 if(pd(sum))ans++; 20 return ; 21 } 22 for(int i=a;i<=n;++i) 23 { 24 if(!vis[i]) 25 { 26 vis[i]=1; 27 sum+=num[i]; 28 dfs(i,s+1); 29 sum-=num[i]; 30 vis[i]=0; 31 } 32 } 33 } 34 int main() 35 { 36 cin>>n>>k; 37 for(int i=1;i<=n;++i) 38 { 39 cin>>num[i]; 40 } 41 for(int i=1;i<=(n-k+1);++i) 42 { 43 memset(vis,0,sizeof(vis)); 44 sum=num[i]; 45 vis[i]=1; 46 dfs(i,1); 47 48 } 49 cout<<ans; 50 return 0; 51 }
时间: 2024-10-10 08:32:53