oi笔记——抽象的深度优先搜索

例题:

\(N个数中选K个数,选出的和要为sum\)

例题分析:

对于每个点,我们可以按“选”和“不选”进行搜索,如图:

或者01背包求解

求解示例(抽象深搜版代码)

#include <iostream>
using namespace std;
int n, k, sum, ans;
int a[40];
void dfs(int i,int cnt,int s) {
if(i==n) {
if(cnt==k&&s==sum) {
ans++;
}
return;
}
dfs(i+1,cnt,s);
dfs(i+1,cnt+1,s+a[i]);
}
int main() {
cin >> n >> k >> sum;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
ans = 0;
dfs(0,0,0);
cout<<ans<<endl;
return 0;
}

定义:

前面说过,dfs 看起来是运行在图上的搜索算法,而前一节给大家展示的 dfs 过程,我们没有看到图的存在,这就是抽象形式的 dfs 的特点。我们可以根据搜索状态构建一张抽象的图,图上的一个顶点就是一个状态,而图上的边就是状态之间的转移关系(进一步搜索或回溯)。虽然 dfs 是在这张抽象的图上进行的,但我们不必把这张图真正地建立出来。

最新文章

  1. 【Alpha】Daily Scrum Meeting第十次
  2. C++11的default和delete关键字
  3. 移动端rem处理字体的js代码
  4. Java提高篇---Stack
  5. robotframework笔记22
  6. *[topcoder]LittleElephantAndString
  7. Java集合类笔试题
  8. [置顶] SpecDD(混合的敏捷方法模型)主要过程概述
  9. SE 2014年5月8日
  10. java学习笔记 --- java基础语法
  11. oracle学习笔记(1)-三级模式SCHEMA
  12. 【CJOJ2498】【DP合集】最长上升子序列 LIS
  13. ORA-28000错误的原因及解决办法
  14. Facebook的React Native之所以能打败谷歌的原因有7个(ReactNative vs Flutter)
  15. Kotlin入门(2)让App开发变得更容易
  16. 【能力提升】SQL Server常见问题介绍及高速解决建议
  17. 【Android】3.8 定位图层展示
  18. qlineedit控件获得焦点
  19. NO9——线段相关
  20. activity堆栈式管理

热门文章

  1. OI生涯回顾
  2. 【LeetCode】不同二叉搜索树
  3. 端口通不通 telnet wget ssh
  4. 141-PHP类的抽象方法和继承实例(一)
  5. oracle学习笔记(4)
  6. 我们是如何将 ToB 服务的交付能力优化 75%?
  7. 压测工具siege和wrk
  8. Elasticsearch 批处理
  9. 洛谷P1433 吃奶酪 题解 状态压缩DP
  10. LeetCode简单题汇总