当前位置: 首页 > news >正文

P1036 [NOIP 2002 普及组] 选数(DFS)

题目描述

已知 n 个整数 x1​,x2​,⋯,xn​,以及 1 个整数 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。

输入格式

第一行两个空格隔开的整数 n,k(1≤n≤20,k<n)。

第二行 n 个整数,分别为 x1​,x2​,⋯,xn​(1≤xi​≤5×106)。

输出格式

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

输入输出样例

输入 #1复制

4 3
3 7 12 19

输出 #1复制

1

题目链接:P1036 [NOIP 2002 普及组] 选数 - 洛谷

学习链接:递推与递归 + DFS | 手把手带你画出递归搜索树_哔哩哔哩_bilibili

解题思路: 

  1.  给出n个数,选k个数作为一个组合,对组合中元素求和,和为素数就累计cnt++
  2. 设置一个桶t[],将未选过的数装进去,容量为k 
  3. 若桶t[]装够了k个数,对其中元素求和,并进行判断是否为素数,若为素数就累计
  4. 剪枝:可选元素个数(n-start+1)<空位置个数(k-x+1)

 代码如下:

#include<bits/stdc++.h>
using namespace std;
int n,k;
int a[25];//可选元素数组
int t[25];//记录组合结果
int visited[25];//标记元素是否已访问
int cnt=0;//累计方案数

//判断是否是素数
bool isprime(int sum)
{
	if(sum<2)	return true;
	for(int i=2;i<=sum/i;i++)
		if(sum%i==0)
			return false;
	return true;
} 

void dfs(int x,int start)
{
	//剪枝:可选元素个数(n-start+1)<空位置个数(k-x+1)
	if(n-start+1<k-x+1)	return ;
	 
	//若枚举的个数已经足够,得到一个组合
	if(x>k)
	{
		//对组合元素求和
		int sum=0; 
		for(int i=1;i<=k;i++)
			sum=sum+t[i];
		//判断sum是否是素数
		if(isprime(sum))
			cnt++;
		return ;//不管sum是不是素数,都要结束搜素 
	} 
	for(int i=start;i<=n;i++)
	{
		//将i位置的元素装入t[] 
		t[x]=a[i];
		//保证枚举t[]的下一个位置的元素是从a[]的下一个位置开始
		dfs(x+1,i+1);
		//腾出位置,搜素下一个组合 
		t[x]=0;
	}
} 
int main()
{
	cin>>n>>k;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	dfs(1,1);//第一个位置从第一个元素开始枚举
	cout<<cnt<<endl; 
	return 0;
}

希望能帮助到各位同志,祝天天开心,学业进步!

http://www.dtcms.com/a/113469.html

相关文章:

  • LeetCode算法题(Go语言实现)_32
  • 详解七大排序
  • 什么是RPC通信
  • 【spring cloud Netflix】Ribbon组件
  • 供应链业务-供应链全局观(二)
  • 蓝桥云客--回文数组
  • 迈向未来:数字化工厂管理如何重塑生产力
  • OpenGL学习笔记(简介、三角形、着色器、纹理、坐标系统、摄像机)
  • 数据库系统概述 | 第三章课后习题答案
  • 蓝桥杯_PCF8591
  • (二)输入输出处理——打造智能对话的灵魂
  • 如何使用 Nginx 代理 Easysearch 服务
  • 洛谷题单3-P5725 【深基4.习8】求三角形-python-流程图重构
  • C语言求3到100之间的素数
  • C++蓝桥杯实训篇(二)
  • Java 逐梦力扣之旅_[204. 计数质数]
  • 大模型持续学习方案解析:灾难性遗忘的工业级解决方案
  • 递归实现组合型枚举(DFS)
  • 蓝牙跳频扩频技术的作用:提升抗干扰能力与通信可靠性的核心机制
  • 道路裂缝数据集CrackForest-156-labelme
  • 设计模式简述(五)建造者模式
  • 小小模拟器 1.2.1 | 免登录无广告,畅玩经典游戏内置金手指
  • 【深度学习新浪潮】视觉与多模态大模型文字生成技术研究进展与产品实践
  • 字节二面:TCP 链接中,接收方不调用 recv,会出现什么情况?——拆解大厂面试题(校招)
  • css flex布局 让子元素在最右边技巧
  • 【移动计算】:AndroidStudio安装和项目搭建【2019:版本3.5.2】
  • 【书籍】DeepSeek谈《人月神话》
  • mofish软件(MacOS版本)手动初始化
  • Vue 3 生命周期钩子详解
  • 记录_文件操作