DFS剪枝

剪枝

将搜索过程中一些不必要的部分剔除掉,因为搜索过程构成了一棵树,剔除不必要的部分,就像是在树上将树枝剪掉,故名剪枝

剪枝是回溯法中的一种重要优化手段,方法往往先写一个暴力搜索,然后找到某些特殊的数学关系,或者逻辑关系,通过它们的约束让搜索树尽可能浅而小,从而达到降低时间复杂度的目的。

一般来说剪枝的复杂度难以计算。

例题

蓝桥oj2942数字王国之军训排队

问题描述

数字王国开学了,它们也和我们人类一样有开学前的军训,现在一共有 n 名学生,每个学生有自己的一个名字 ai​(数字王国里的名字就是一个正整数,注意学生们可能出现重名的情况),此时叛逆教官来看了之后感觉十分别扭,决定将学生重新分队。

排队规则为:将学生分成若干队,每队里面至少一个学生,且每队里面学生的名字不能出现倍数关系(注意名字相同也算是倍数关系)。

现在请你帮忙算算最少可以分成几队?

例:有 4 名学生 (2,3,4,4),最少可以分成 (2,3)、(4)、(4) 共 3 队。

输入格式

第一行包含一个正整数 n,表示学生数量。

第二行包含 n 个由空格隔开的整数,第 i 个整数表示第 i 个学生的名字 ai​。

输出格式

输出共 1 行,包含一个整数,表示最少可以分成几队。

样例输入

4
2 3 4 4

样例输出

3

解1.不剪枝

#include <iostream>
#include<vector>
#include<algorithm>
using namespace std;
const int N = 15;
int a[N],n;vector<int>v[N];//v[i]表示第i组里面所有人的编号//cnt表示队伍数量,dfs返回在cnt个队伍的情况下是否可以成功分组bool dfs(int cnt, int dep)
{if (dep == n + 1){//说明每个人都成功分组了//检查当前方案的合法性for (int i = 1; i <= cnt; i++)//每个队伍枚举里面所有的二元组{for (int j = 0; j < v[i].size(); j++){for (int k = j+1; k < v[i].size(); k++){if (v[i][k] % v[i][j] == 0)return false;}}}return true;}//枚举每个人所属的队伍for (int i = 1; i <= cnt; i++){v[i].push_back(a[dep]);if (dfs(cnt, dep + 1))return true;//恢复现场v[i].pop_back();}return false;
}int main()
{// 请在此输入您的代码cin >> n;for (int i = 1; i <= n; i++)cin >> a[i];sort(a + 1, a + 1 + n);//枚举n个for (int i = 1; i <= n; i++){if (dfs(i, 1))//i个队伍,从第一层开始搜索,看这种情况是否可以装的下(即成功分组){cout << i << endl;break;}}return 0;
}

解2.剪枝(我没太懂,先放着)

#include <iostream>
#include<vector>
#include<algorithm>
using namespace std;
const int N = 15;
int a[N],n;vector<int>v[N];//v[i]表示第i组里面所有人的编号//cnt表示队伍数量,dfs返回在cnt个队伍的情况下是否可以成功分组bool dfs(int cnt, int dep)
{if (dep == n + 1){//说明每个人都成功分组了//检查当前方案的合法性for (int i = 1; i <= cnt; i++)//每个队伍枚举里面所有的二元组{for (int j = 0; j < v[i].size(); j++){for (int k = j+1; k < v[i].size(); k++){if (v[i][k] % v[i][j] == 0)return false;}}}return true;}//枚举每个人所属的队伍for (int i = 1; i <= cnt; i++){bool tag = true;
for(const auto &j:v[i])if (a[dep] % j == 0){tag = false;break;}
if (!tag)continue;v[i].push_back(a[dep]);if (dfs(cnt, dep + 1))return true;//恢复现场v[i].pop_back();}return false;
}int main()
{// 请在此输入您的代码cin >> n;for (int i = 1; i <= n; i++)cin >> a[i];sort(a + 1, a + 1 + n);//枚举n个for (int i = 1; i <= n; i++){if (dfs(i, 1))//i个队伍,从第一层开始搜索,看这种情况是否可以装的下(即成功分组){cout << i << endl;break;}}return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/716338.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

超详细红黑树的模拟实现

前言 有人说设计出AVL树的的人是个大牛&#xff0c;那写红黑树&#xff08;RBTree&#xff09;的人就是天才&#xff01; 上一篇文章&#xff0c;我们已经学习了AVL树&#xff0c;牛牛个人认为AVL树已经够优秀了&#xff0c;那让我们一起探究一下&#xff0c;为什么红黑树比AV…

链表类型题目

文章目录 简介链表的常用技巧两数相加原理代码代码|| 两两交换链表中的节点代码原理 重排链表(重要)原理代码 合并 K 个升序链表代码递归代码 K 个一组翻转链表原理代码 简介 大家好,这里是jiantaoyab,这篇文章给大家带来的是链表相关的题目练习和解析,希望大家能相互讨论进步 …

[线代]自用大纲

部分内容整理自张宇和网络 序 题型分布&#xff1a; 题型单题分值题目数量总分值选择题5315填空题515解答题12112 *一道大题可能用到六部分所有知识 矩阵 性质 k k k倍和乘积行列式 ∣ k A ∣ k n ∣ A ∣ |kA|k^n|A| ∣kA∣kn∣A∣ ∣ A B ∣ ≠ ∣ A ∣ ∣ B ∣ |AB|≠…

DDE图像增强

DDE&#xff08;Detail and Darkness Enhancement&#xff0c;细节和暗部增强&#xff09;是一种用于增强图像细节和暗部区域的方法。其原理可以简要概括如下&#xff1a; 细节增强&#xff1a;在图像中突出显示细节信息&#xff0c;使得图像更加清晰和具有视觉冲击力。这可以通…

蓝桥杯刷题--python-15-二分(进阶)

503. 借教室 - AcWing题库 n,mmap(int,input().split()) class_list(map(int,input().split())) class_[0]class_ d[0] s[0] t[0] for _ in range(m): dj,sj,tjmap(int,input().split()) d.append(dj) s.append(sj) t.append(tj) def check(k): b[0]*(n2) …

如何解决微服务的数据一致性分发问题?

介绍 系统架构微服务化以后,根据微服务独立数据源的思想,每个微服务一般具有各自独立的数据源,但是不同微服务之间难免需要通过数据分发来共享一些数据,这个就是微服务的数据分发问题。Netflix/Airbnb等一线互联网公司的实践[参考附录1/2/3]表明,数据一致性分发能力,是构…

在嵌入式设备中用多项式快速计算三角函数和方根

惯性传感器的倾角计算要用到三角函数. 在 MCS-51, Cortex M0, M3 之类的芯片上编程时, 能使用的资源是非常有限, 通常只有两位数KB的Flash, 个位数KB的RAM. 如果要使用三角函数和开方就要引入 math.h, 会消耗掉10KB以上的Flash空间. 在很多情况下受硬件资源限制无法使用 math.…

【 10X summary report】怎么看?详细解读笔记

报告内容 在开始正式的分析之前&#xff0c;需要查看在对齐和计数过程中生成的任何总结统计信息。下图是由Cell Ranger工具创建的10X总结报告&#xff0c;在从10X scRNA-seq实验生成计数矩阵时会生成。 The left half of the report describes sequencing and mapping statist…

卖wordpress网站模板的网站

WP模板牛 http://www.wpniu.com 上面有很多免费wordpress模板资源的网站&#xff0c;除了免费模板&#xff0c;还有付费模板。 My模板(我的模板) http://www.mymoban.com 老牌网站模板资源站&#xff0c;上面有wordpress模板、帝国CMS模板、WooCommerce模板可以直接免费下载…

Linux whois命令教程:查询域名所有者信息(附案例详解和注意事项)

Linux whois命令介绍 whois命令是一个用于查询域名所有者信息的工具。它可以直接从命令行进行查询&#xff0c;这对于没有图形用户界面的系统或者需要在shell脚本中进行查询的情况非常有用。 Linux whois命令适用的Linux版本 whois命令在大多数Linux发行版中都可以使用&…

C++之stack

1、stack简介 stack是实现的一个先进后出&#xff0c;后进先出的容器。它只有一个出口&#xff0c;只能操作最顶端元素。 2、stack库函数 &#xff08;1&#xff09;push() //向栈压入一个元素 &#xff08;2&#xff09;pop() //移除栈顶元素 &#xff08;3…

基于springboot+vue的中国陕西民俗网

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

在 Angular 中使用 Renderer2

Renderer2 类 Renderer2 类是 Angular 提供的一个抽象服务&#xff0c;允许在不直接操作 DOM 的情况下操纵应用程序的元素。这是推荐的方法&#xff0c;因为它使得更容易开发可以在没有 DOM 访问权限的环境中渲染的应用程序&#xff0c;比如在服务器上、在 Web Worker 中或在原…

Java如何剪切视频

背景&#xff1a;如何使用Java批量切割视频 FFmpeg 是一个强大的开源多媒体处理工具&#xff0c;被广泛应用于音视频的录制、转码、编辑等方面。它支持几乎所有主流的音视频格式&#xff0c;能够在各种操作系统平台上运行&#xff0c;包括 Windows、macOS 和 Linux。FFmpeg 提…

nginx,php-fpm

一&#xff0c;Nginx是异步非阻塞多进程&#xff0c;io多路复用 1、master进程&#xff1a;管理进程 master进程主要用来管理worker进程&#xff0c;具体包括如下4个主要功能&#xff1a; &#xff08;1&#xff09;接收来自外界的信号。 &#xff08;2&#xff09;向各worker进…

SAP PP学习笔记04 - BOM2 -通过Serial来做简单的BOM变式配置,副明细,BOM状态,BOM明细状态,项目种类,递归BOM

本章继续讲BOM。 本章讲通过Serial来做简单的BOM变式配置。还讲了BOM的相关概念&#xff1a;副明细&#xff0c;BOM状态&#xff0c;BOM明细状态&#xff0c;项目种类&#xff0c;递归BOM 等。 1&#xff0c;通过Serial&#xff08;序列号&#xff09;来做简单的 VC&#xff0…

spring自定义注解之-ElementType.METHOD方法级注解声明

自定义注解类型和常用场景 可以参考之前的文章 &#xff1a; ElementType.FIELD字段级注解声明 如果在项目中&#xff0c;多处地方都需调用到同一个方法进行逻辑处理&#xff0c;且与方法的业务逻辑无关&#xff0c;比如监控&#xff0c;日志等&#xff0c;则可用自定义的方法…

【JavaSE】面向对象——继承性

继承性 继承性的概念 所谓继承&#xff0c;就是程序猿在保持原有类特性的基础上进行扩展&#xff0c;增加新功能&#xff0c;这样的类被称为派生类或者子类&#xff0c;原有类被称为超类或者基类。 在对于继承性概念进行书写前&#xff0c;我曾查阅许多资料来保证对其表达的…

Some collections -- 2024.3

一、TensorFlow Android (dataset: Mnist) We used TensorFlow to define and train our machine learning model, which can recognize handwritten numbers, called a number classifier model in machine learning terminology. We transform the trained TensorFlow mod…

C++学习第五天(内存管理)

1、内存分布 int globalVar 1; static int staticGlobalVar 1; void Test() {static int staticVar 1;int localVar 1;int num1[10] { 1, 2, 3, 4 };char char2[] "abcd";const char* pChar3 "abcd";int* ptr1 (int*)malloc(sizeof(int) * 4);int…