1008 选数 2002年NOIP全国联赛普及组

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 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 using namespace std;
 6 const int MAXN=10001;
 7 int a[MAXN];
 8 int tot=0;
 9 int ans[MAXN];
10 int vis[MAXN];
11 int now=1;
12 int n,m;
13 int num;
14 int flag[MAXN];
15 int pd(int n)
16 {
17     for(int i=2;i<=sqrt(n);i++)
18     {
19         if(n%i==0)
20         return 0;
21     }
22     return 1;
23 }
24 void dfs(int p,int ed)
25 {
26     if(p==m)
27     {
28         int maxn=0;
29         for(int i=1;i<=m;i++)
30         {
31             maxn=maxn+ans[i];
32         }
33         if(pd(maxn)==1)
34         {
35             num++;
36         }
37         return ;
38     }
39     for(int i=ed;i<=n;i++)
40     {
41                 ans[now]=a[i];
42                 now++;
43                 flag[i]=1;
44                 dfs(p+1,i+1);
45                 now--;
46                 ans[now]=0;
47                 flag[i]=0;
48     }
49 }
50 int main()
51 {
52     scanf("%d%d",&n,&m);
53     for(int i=1;i<=n;i++)
54     {
55         scanf("%d",&a[i]);
56         tot=tot+a[i];
57     }
58     /*for(int i=2;i<=sqrt(tot);i++)
59     {
60         if(vis[i]==0)
61         {
62             for(int j=i*i;j<=tot;j=j+i)
63             {
64                 vis[j]=1;
65             }
66
67         }
68     }*/
69     dfs(0,1);
70     printf("%d",num);
71     return 0;
72 }
时间: 2024-08-02 02:48:02

1008 选数 2002年NOIP全国联赛普及组的相关文章

codevs 1009 产生数 2002年NOIP全国联赛普及组 x (内附解析w)

题目描述 Description 给出一个整数 n(n<10^30) 和 k 个变换规则(k<=15). 规则: 一位数可变换成另一个一位数: 规则的右部不能为零. 例如:n=234.有规则(k=2): 2-> 5 3-> 6 上面的整数 234 经过变换后可能产生出的整数为(包括原数): 234 534 264 564 共 4 种不同的产生数问题: 给出一个整数 n 和 k 个规则.求出: 经过任意次的变换(0次或多次),能产生出多少个不同整数. 仅要求输出个数. 输入描述 In

1010 过河卒 2002年NOIP全国联赛普及组codevs

1010 过河卒  2002年NOIP全国联赛普及组codevs 题目描述 Description 如图,A 点有一个过河卒,需要走到目标 B 点.卒行走规则:可以向下.或者向右.同时在棋盘上的任一点有一个对方的马(如上图的C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点.例如上图 C 点上的马可以控制 9 个点(图中的P1,P2 … P8 和 C).卒不能通过对方马的控制点. 棋盘用坐标表示,A 点(0,0).B 点(n,m)(n,m 为不超过 20 的整数,并由键盘输入),同样马

棋盘型动态规划 之 CODE[VS] 1010 过河卒 2002年NOIP全国联赛普及组

/* dp[i][j] := 从起点[0][0]到坐标为[i][j]的位置,路径的条数. 卒行走规则:可以向下.或者向右,故 dp[i][j] = dp[i-1][j] + dp[i][j-1] (向下)      (向右) 注意: 去掉对方马的控制点 附: codevs测试数据有些弱,可以考虑到这里评测一下:清橙 (主要区别在于,dp[][]数据类型设为long long) */ 1 #include <iostream> 2 #include <cstdlib> 3 #incl

【动态规划】【记忆化搜索】CODEVS 1010 过河卒 2002年NOIP全国联赛普及组

f(i,j)=f(i-1,j)+f(i,j-1),显然可以暴力递归求解,但是很多重复的状态,所以可以记忆下来. 注意障碍点和边界的特判. 1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 int x1,y1,x2,y2,dp[25][25]; 5 bool a[25][25]; 6 const int dx[]={1,-1,1,-1,2,-2,2,-2},dy[]={2,2,-2,-2,1,1,-1,-1

洛谷 P1980 记数问题 2013年NOIP全国联赛普及组

3291 记数问题 2013年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解题目描述 Description试计算在区间1到n的所有整数中,数字x(0≤x≤9)共出现了多少次?例如,在1到11中,即在1.2.3.4.5.6.7.8.9.10.11中,数字1出现了4次. 输入描述 Input Description输入共1行,包含2个整数n.x,之间用一个空格隔开. 输出描述 Output Description输出共1行,包含一个整

1143 纪念品分组 2007年NOIP全国联赛普及组

1143 纪念品分组 2007年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题解 查看运行结果 题目描述 Description 元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作.为使得参加晚会的同学所获得的纪念品价值相对均衡,他要把购来的纪念品根据价格进行分组,但每组最多只能包括两件纪念品,并且每组纪念品的价格之和不能超过一个给定的整数.为了保证在尽量短的时间内发完所有纪念品,乐乐希望分组的数目最少. 你的任务是写一个程序

【1083】code[vs] 1083 Cantor表 1999年NOIP全国联赛普及组

嘿嘿嘿,又是一发水题…… [传送门]:http://codevs.cn/problem/1083/ >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>原题>>>>>>>>>>>>>>>>>>>>

codevs 1102 采药 2005年NOIP全国联赛普及组

1102 采药 2005年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB gold 题目描述 Description 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师.为此,他想拜附近最有威望的医师为师.医师为了判断他的资质,给他出了一个难题.医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值.我会给你一段时间,在这段时间里,你可以采到一些草药.如果你是一个聪明的孩子,你应该可以让采到

1102 采药 2005年NOIP全国联赛普及组

1102 采药 2005年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师.为此,他想拜附近最有威望的医师为师.医师为了判断他的资质,给他出了一个难题.医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值.我会给你一段时间,在这段时间里,你可以采到一些草药.如果你是一个聪明的孩