蓝桥杯备赛:Day5-P1036 选数

📚 算法笔记:P1036 [NOIP 2002 普及组] 选数

1. 题目描述

P1036 [NOIP 2002 普及组\] 选数 - 洛谷](https://www.luogu.com.cn/problem/P1036) 从 n n n 个整数中任选 k k k 个数相加,统计有多少种选法的**和** 为**质数**。 * 数据范围: n ≤ 20 , k \< n n \\le 20, k \< n n≤20,k\ using namespace std; typedef long long ll; ll a[25]; // 存储输入的 n 个数 int N, K; ll ans = 0; // 计数器:符合条件的质数和个数 // 质数判定:O(sqrt(sum)) bool is_prime(int n) { if (n < 2) return false; for (int i = 2; i * i <= n; i++) { if (n % i == 0) return false; } return true; } // DFS 组合模型 // position: 当前选到了第几个数 // sum: 当前已选数字的累加和 // start: 搜索起点,保证下标单调递增 void dfs(int position, ll sum, int start) { // 1. 递归出口:选够了 K 个数 if(position > K) { if(is_prime(sum)) ans++; return; } // 2. 组合模型核心:从 start 开始往后选,不回头 for(int i = start; i <= N; i++) { // 隐式回溯:sum + a[i] 作为参数传递,无需手动撤销 dfs(position + 1, sum + a[i], i + 1); } } void solve() { if(!(cin >> N >> K)) return; for (int i = 1; i <= N; i++) cin >> a[i]; ans = 0; dfs(1, 0, 1); cout << ans << endl; } int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int _ = 1; while(_--) solve(); return 0; } ``` *** ** * ** *** #### 3. 核心考点与注意事项 * **组合模型 (Combination)** :与全排列不同,组合不计较顺序。通过引入 `start` 参数,强制让选取的下标**单调递增** ( i → i + 1 i \\rightarrow i+1 i→i+1),从而物理隔绝了重复排列(如选了 1 , 2 1,2 1,2 就不会再选 2 , 1 2,1 2,1)。 * **隐式回溯** :在 `dfs(position + 1, sum + a[i], i + 1)` 中,`sum + a[i]` 的结果直接传给下一层。当递归返回时,本层的 `sum` 值并没有改变,因此**不需要** 像 `used` 数组那样手动执行 `sum -= a[i]`。 * **质数优化** :使用 `i * i <= n` 进行判定,时间复杂度为 O ( N ) O(\\sqrt{N}) O(N ),是应对高频调用的标准写法。

相关推荐
.小小陈.7 小时前
Linux 多线程进阶:线程互斥、同步、线程池、死锁与线程安全、读写锁、自旋锁
linux·开发语言·c++
lingran__7 小时前
C++入门基础
开发语言·c++
代码改善世界8 小时前
【C++进阶】二叉搜索树
java·数据结构·c++
春蕾夏荷_7282977258 小时前
c++ 编译abseil-cpp
c++·abseil-cpp
ComputerInBook9 小时前
C++ 17 相比 C++ 14 新增之特征
开发语言·c++·c++ 17
Peter·Pan爱编程9 小时前
引用:比指针更安全的别名
c++·指针·引用·c++基础
m0_502724959 小时前
golang 、java、c++、javascript 语言switch case异同
java·javascript·c++·golang
我命由我123459 小时前
Android Framework P1 - 低配学习 Framework 方案、开机启动 Init 进程
android·c语言·c++·学习·android jetpack·android-studio·android runtime
许长安9 小时前
互斥锁、自旋锁、读写锁使用场景以及底层实现
c++·经验分享·笔记
Season45010 小时前
C++11并发支持库(condition_variable | future全家桶)
java·jvm·c++