NOIP2002-普及组复赛-第三题-选数
题目描述 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)。
3+7+12=22 3+7+19=29 7+12+19=38 3+12+19=34。
现在,要求你计算出和为素数共有多少种。
例如上例,只有一种的和为素数:3+7+19=29)。
输入输出格式 Input/output
输入格式:
键盘输入,格式为:
n , k (1<=n<=20,k<n)
x1,x2,…,xn (1<=xi<=5000000)
输出格式:
屏幕输出,格式为:
一个整数(满足条件的种数)。
键盘输入,格式为:
n , k (1<=n<=20,k<n)
x1,x2,…,xn (1<=xi<=5000000)
输出格式:
屏幕输出,格式为:
一个整数(满足条件的种数)。
输入输出样例 Sample input/output
样例测试点#1
输入样例:
4 3
3 7 12 19
输出样例:
1
思路:模拟,不解释!
代码如下:
1 //使用数组input保存各个数字是否被用过的标志,使用数组a保存输入的数字 2 #include <stdio.h> 3 #include <math.h> 4 #include <string.h> 5 int sort=0,n,k,a[40]; 6 int sushu(int x) //是素数返回1,不是返回0 7 { 8 int i,y; 9 y=sqrt(x); 10 for(i=2;i<=y;i++) 11 if(x%i==0) 12 return 0; 13 return 1; 14 } 15 void f(int input[],int pos,int m) //f(被操作数组,所在位置,选m个数) 16 { 17 if(m==0) 18 { 19 int j,sum=0; 20 for(j=0;j<n;j++) 21 if(input[j]==1) 22 sum+=a[j]; 23 if(sushu(sum)==1) 24 sort++; 25 return; 26 } 27 else 28 { 29 int i; 30 for(i=pos;i<n;i++) 31 { 32 if(input[i]==0) 33 input[i]=1; 34 f(input,i+1,m-1); 35 input[i]=0; 36 } 37 } 38 return; 39 } 40 int main() 41 { 42 int input[40],i; 43 scanf("%d%d",&n,&k); 44 for(i=0;i<n;i++) 45 scanf("%d",&a[i]); 46 memset(input,0,sizeof(int)*40); 47 f(input,0,k); 48 printf("%d\n",sort); 49 return 0; 50 }
我不怕千万人阻挡,只怕自己投降…