• 周六. 4月 20th, 2024

5G编程聚合网

5G时代下一个聚合的编程学习网

热门标签

NOIP2002-普及组复赛-第三题-选数

admin

11月 28, 2021
题目描述 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/output
输入格式:
键盘输入,格式为:
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
",sort);    
49     return 0;    
50 }    

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注