选数【搜索 深度优先搜索,DFS 素数判断,质数,筛法】

该文章介绍了一道NOIP编程竞赛中的问题,要求从n个整数中选取k个数求和,计算所有可能的组合中和为素数的情况。解决方案是利用深度优先搜索(DFS)算法,配合素数判断函数,遍历所有可能的组合并统计满足条件的种类数。程序示例中展示了如何实现DFS和素数判断,并给出了样例输入和输出。
摘要由CSDN通过智能技术生成

选数【搜索 深度优先搜索,DFS 素数判断,质数,筛法】

[NOIP2002 普及组] 选数

题目描述

已知 n 个整数 x_1,x_2,\cdots,x_n,以及 1 个整数 kk<n)。从 n 个整数中任选 k 个整数相加,可分别得到一系列的和。例如当 n=4k=34 个整数分别为 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,k1 <= n <= 20k<n)。

第二行 n 个整数,分别为 x_1,x_2,````,x_n1 <= x_i <= 5*10^6)。

输出格式

输出一个整数,表示种类数。

样例输入 #1

4 3
3 7 12 19

样例输出 #1

1

题目分析

主要是一个DFS深搜,要从n个数中找出任意k个数相加,计算其值是否为素数。

  • 和排列组合为问题相似,n选3,n选n,有几种排列的方式
  • 但是这个题要的是 k 个数,所以要使用 num 来计数
  • 并且还需要用一个 for 循环来控制是否需要进入 dfs

程序如下:

#include<stdio.h>
int n,k,a[25],t;
int sushu(int b) {
	int i;
	if(b<2)
		return 0;
	for(i=2; i*i<=b; i++)
		if(b%i==0)
			return 0;
	return 1;
}
void dfs(int num,int sum,int j) {
	int i;
	if(num==k) {//递归num次代表有num个数相加 
		if(sushu(sum))
			t++;
		return;
	}
	for(i=j; i<n; i++)
		dfs(num+1,sum+a[i],i+1);//当i+1大于等于n时剪枝 
	return;
}
int main() {
	int i;
	scanf("%d %d",&n,&k);//输入n和k 
	for(i=0; i<n; i++) {
		scanf("%d",&a[i]);//将n个数存放在a[]数组中 
	}
	dfs(0,0,0);//(取到的个数,取到的数值和,剪枝条件) 
	printf("%d",t);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值