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

P1036 [NOIP 2002 普及组] 选数(dfs+素数筛选)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const int N=1e8+5;
vector<bool> is(N, true);  // 使用 bool,初始化全 true

void f() {// 埃氏筛法,预处理 0 到 N-1 的素数表
    is[0] = is[1] = false;  // 非素数
    for (int i = 2; i * i < N; i++) {
        if (is[i]) {
            for (int j = i * i; j < N; j += i) {  
                is[j] = false;
            }
        }
    }
}

int n,k;
ll x[25];
vector<ll> comb;
int ans=0;

void dfs(int pos,int cnt){
	if(cnt==k){ // 终止条件:已选 k 个数
		ll sum=0; // 计算当前组合的和
		for(int i=0;i<k;i++){
			sum+=comb[i];
		}
		if(is[sum]) ans++;
		return;
	}
	if(pos>=n || n-pos+cnt<k) // 剪枝:位置超界或剩余数不足
	return;
	
	comb.push_back(x[pos]);// 选择当前数 x[pos],加入组合
	dfs(pos+1,cnt+1); // 递归:位置加 1,计数加 1
	comb.pop_back(); // 回溯:撤销选择
	
	dfs(pos+1,cnt); // 不选当前数,递归下一位置
}

int main(){	
	f();
	cin>>n>>k;
	for(int i=0;i<n;i++){
		cin>>x[i];
	}
	dfs(0,0); // 从位置 0 开始,选 0 个数,开始回溯
	cout<<ans;
	return 0;
}

 

dfs

  • pos :当前考虑的数组位置。

  • cnt :已选择的数量。

剪枝 :

pos>=n:超出数组范围。

n−pos+cnt<k:剩余元素不足以选到 k  个,返回。

相关文章:

  • forge-1.21.x模组开发(一)注册方块和物品
  • Vue学习教程-15自定义指令
  • python 使用知识点 pyinstaller 虚拟环境打包
  • Java 18~20 新特性
  • Transformers快速入门-学习笔记
  • 一个基本的pyside6项目模板demo
  • Linux 命令大全完整版(06)
  • 【并发编程】线程池任务抛异常会怎么样?
  • NI Multisim仿真实现39计数器
  • Linux 权限系统和软件安装(二):深入理解 Linux 权限系统
  • 綫性與非綫性泛函分析與應用_3.例題-母本
  • AI发展迅速,是否还有学习前端的必要性?
  • 音视频封装格式:多媒体世界的“容器”与“桥梁”
  • 契约思维驱动开发:OpenAPI的最佳实践
  • 【论文解读】TransMLA: Multi-Head Latent Attention Is All You Need
  • Rust语言基础知识详解【一】
  • RMII(Reduced Media Independent Interface)详解
  • 基于Spring Boot的公司资产网站设计与实现(LW+源码+讲解)
  • Redis过期数据处理
  • 7. H264码流
  • 俄军方:已完成库尔斯克地区全面控制行动
  • 对话|男篮国手杨瀚森:参加NBA选秀,去更大的舞台追梦
  • 利用AI捏造“天价骨灰盒”谣言,内蒙古包头一网民被行政处罚
  • 四川一国企“80后”掌门人为报领导“知遇之恩”,盲目决策致数亿损失
  • 从“高阶智驾”到“辅助驾驶”,上海车展上的“智驾”宣发变调
  • 无视规范开“远端”、企业云端被窃密,国安部:莫让运维成运“危”