【dfs解决分组问题-两道例题——供佬学会!】(A元素是放在已经存在的组别中,还是再创建一个更好?--小孩子才做选择,dfs直接两种情况都试试)
问题关键就是:
一个点,可能
新开一个组
比
放到已经存在的组
更划算
因为后面的数据,我们遍历之前的点时,并不知道
所以我们应该针对每个点,都应该做出一个选择就是
新开一个元组或者放到之前的元组中,都尝试一次(截取重点内容,继续往下看)
我们发现这道题目有两个可以剪枝的部分,
一个是如果当前的答案已经大于了我们已知的最小答案,不用说直接return返回即可.
第二个剪枝则是,我们可以将小猫的体重从大到小排序,这样我们的搜索树就会缩短许多,至于为什么,因为我们的剩余空间就变小了,然后可选择的猫也就少了
(截取重点内容,继续往下看)
欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录)
文章字体风格:
红色文字表示:重难点★✔
蓝色文字表示:思路以及想法★✔
如果大家觉得有帮助的话,感谢大家帮忙
点赞!收藏!转发!
dfs解决分组问题
- 分成互质组
- 错误想法:从头遍历,如果不匹配,则开新组
- 正确想法:小孩子才做选择,dfs直接两种情况都试试
- 小猫爬山
- 减枝思想!!!
分成互质组

首先什么是互质?
互质就是 彼此的最大公约数是 1
求a,b的最大公约数
int gcd(int a,int b)
{while(b){int c = a % b;a = b;b = c;}return a;
}
错误想法:从头遍历,如果不匹配,则开新组
本题,我的想法是:
从头遍历,如果不匹配,则开新组
用样例说就是
6
14 20 33 117 143 175选择20看之前已经开辟的 组别如果已经存在的 组别中的元素
和当前的不符合,那么换另一个组别再次尝试
如果都不合适,那么直接创建新组
错误代码
#include<iostream>
#include<vector>using namespace std;const int N = 11;int n;
int a[N];
vector<int> g[N];int gcd(int a,int b)
{while(b){int c = a % b;a = b;b = c;}return a;
}
int g_size;
void dfs(int u)
{if(u>n)return;for(int i = 1; i <= g_size; i++){int flag = 1;for(int j = 0; j < g[i].size(); j++){if(gcd(a[u],g[i][j])!=1){flag = 0;}}if(flag==1){// cout << a[u] << ' ';g[i].push_back(a[u]);dfs(u+1);return;}}g_size+=1;g[g_size].push_back(a[u]);dfs(u+1);return;
}int main()
{cin >> n;for(int i = 1; i <= n; i++)cin >> a[i];dfs(1);cout << g_size << endl;return 0;
}
正确想法:小孩子才做选择,dfs直接两种情况都试试
但是出现问题了
4
3 7 6 14这个样例 安上述思想 分组
3 7
6
14
分出3个组
但是
如果按着 正常分组
应该是
3
7 6 14
这样更好
问题关键就是:
一个点,可能
新开一个组
比
放到已经存在的组
更划算
因为后面的数据,我们遍历之前的点时,并不知道
所以我们应该针对每个点,都应该做出一个选择就是
新开一个元组或者放到之前的元组中,都尝试一次
//正确代码
#include<iostream>
#include<vector>using namespace std;const int N = 11;int n;
int a[N];int gcd(int a,int b)
{while(b){int c = a % b;a = b;b = c;}return a;
}
int ans = 0x3f3f3f3f;
void dfs(int g_size,vector<int> g[N],int u)
{if(u>n){ans = min(g_size,ans);return;}for(int i = 1; i <= g_size; i++){int flag = 1;for(int j = 0; j < g[i].size(); j++){if(gcd(a[u],g[i][j])!=1){flag = 0;}}if(flag==1){// cout << a[u] << ' ';g[i].push_back(a[u]);dfs(g_size,g,u+1);g[i].pop_back();}}g[g_size+1].push_back(a[u]);dfs(g_size+1,g,u+1);g[g_size+1].pop_back();
}int main()
{cin >> n;for(int i = 1; i <= n; i++)cin >> a[i];vector<int> g[N];dfs(0,g,1);cout << ans << endl;return 0;
}
小猫爬山

减枝思想!!!
本题思路和上题一样,
但关键一点是,咱们可以借助本题,学会剪枝思想
-
当我们按某一种方案遍历过程时,发现走到一半发现这个方案,走到了一半已经比我之前走过的方案更费时费力,那么就直接不走这个方案了,减枝
-
或者走的过程中,按着从大到小 或者从小到大走,这样说不定也会省时省力,也是减枝
-
或者就是我们知道了可实现的最坏情况
那么超过可实现的最坏情况,一定是不对的,直接不需要继续dfs了,也是剪枝
我们发现这道题目有两个可以剪枝的部分,
一个是如果当前的答案已经大于了我们已知的最小答案,不用说直接return返回即可.
第二个剪枝则是,我们可以将小猫的体重从大到小排序,这样我们的搜索树就会缩短许多,至于为什么,因为我们的剩余空间就变小了,然后可选择的猫也就少了
/** Project: 0x22_深度优先搜索* File Created:Sunday, January 24th 2021, 11:31:12 am* Author: Bug-Free* Problem:AcWing 165. 小猫爬山*/
#include <algorithm>
#include <iostream>using namespace std;const int N = 2e1;int cat[N], cab[N];
int n, w;
int ans;bool cmp(int a, int b) {return a > b;
}void dfs(int now, int cnt) {if (cnt >= ans) {return;}if (now == n + 1) {ans = min(ans, cnt);return;}//尝试分配到已经租用的缆车上for (int i = 1; i <= cnt; i++) { //分配到已租用缆车if (cab[i] + cat[now] <= w) {cab[i] += cat[now];dfs(now + 1, cnt);cab[i] -= cat[now]; //还原}}// 新开一辆缆车cab[cnt + 1] = cat[now];dfs(now + 1, cnt + 1);cab[cnt + 1] = 0;
}int main() {cin >> n >> w;for (int i = 1; i <= n; i++) {cin >> cat[i];}sort(cat + 1, cat + 1 + n, cmp);ans = n;dfs(1, 0);cout << ans << endl;return 0;
}相关文章:
【dfs解决分组问题-两道例题——供佬学会!】(A元素是放在已经存在的组别中,还是再创建一个更好?--小孩子才做选择,dfs直接两种情况都试试)
问题关键就是: 一个点,可能 新开一个组 比 放到已经存在的组 更划算 因为后面的数据,我们遍历之前的点时,并不知道 所以我们应该针对每个点,都应该做出一个选择就是 新开一个元组或者放到之前的元组中,都尝…...
使用Hexo在Github上搭建个人博客
使用Hexo在Github上搭建个人博客 1. 安装Node和git2. 安装Hexo3. Git与Github的准备工作4. 将Hexo部署到Github5. 开始写作 1. 安装Node和git 在Mac上安装Node.js可以使用Homebrew,使用以下命令安装: brew install node使用以下命令安装Git: …...
【面试题】面试官:说说你对 CSS 盒模型的理解
前言 CSS 盒模型是 CSS 基础的重点难点,因此常被面试官们拿来考察候选人对前端基础的掌握程度,这篇文章将对 CSS 盒模型知识点进行全面的梳理。 我们先看个例子:下面的 div 元素的总宽度是多少呢? js <!DOCTYPE html> &…...
【ROS2】学习笔记
1. 基础概念 1.1 执行单元 1.1.1 executable——执行程序 executable表示针对某个目标的程序执行流程,一个executable可以启动多个node; 1.1.2 node——“进程” node其实就是进程的意思; ROS2允许同时启动两个相同的node,&a…...
Springboot +Flowable,流程表单应用之外置表单(JSON形式)(二)
一.简介 整体上来说,我们可以将Flowable 的表单分为三种不同的类型: 动态表单 这种表单定义方式我们可以配置表单中每一个字段的可读性、可写性、是否必填等信息,不过不能定义完整的表单页面。外置表单 外置表单我们只需要定义一下表单的 k…...
JavaScript如何使用if语句
JavaScript的if语句可以让我们根据某些条件来执行不同的代码块。使用if语句的基本思路是将要执行的代码放在括号内,并使用if关键字进行匹配。下面是一些例子: 简单的if语句: let age 18; if (age > 18) { console.log("You are…...
XSS攻击以及java应对措施
文章目录 一. XSS攻击介绍1. 前端安全2. xss攻击简介3. xss的攻击方式 二. java应对xss攻击的解决方案1. 强制修改html敏感标签内容2. 利用过滤器过滤非法html标签 一. XSS攻击介绍 1. 前端安全 随着互联网的高速发展,信息安全问题已经成为企业最为关注的焦点之一…...
yolo 训练
这里写目录标题 分配训练集&Validation数量数据集读取读取全部文件夹替换路径 loss weightNMSBBox_IOUEIou Optimizer 分配训练集&Validation数量 validation_size training_size * validation_ratio / (1 - validation_ratio)training_size 219 validation_ratio …...
谷歌chrome浏览器升级新版后字体显示不清楚解决方案
谷歌chrome浏览器升级新版后字体显示不清楚解决方案 参考图片: Chrome更新至版本Chrome 109.0.5414.120 字体看不清 浏览器症状与表现 Chrome更新至版本Chrome 109.0.5414.120 字体看不清;会很细,在设置中选择自定义的字体,仍无法…...
在外包干了三年,我废了……不吹不黑!
没错,我也干过外包,一干就是三年,三年后,我废了…… 虽说废的不是很彻底,但那三年我几乎是出差了三年、玩了三年、荒废了三年,那三年,我的技术能力几乎是零成长的。 说起这段三年的外包经历&a…...
【Vue】学习笔记-消息的订阅与发布
消息的订阅与发布(基本不用) 消息订阅与发布(pubsub)消息订阅与发布是一种组件间的通信的方式,适用于任意组件间通信 消息订阅与发布 1.订阅消息∶消息名 2.发布消息︰消息内容 消息订阅与发布的工作流程: (A是订阅者,B是发布…...
大疆无人机 MobileSDK(遥控器/手机端)开发 v5版<1>
文章目录 概要整体架构流程技术细节SDK 架构体系概述层级架构智能任务空白项目集成 MSDK新建空白项目新建 MyApplication.kt 文件修改 build.gradle(Module) 文件修改 AndroidManifest.xml 文件修改 MainActivity.kt 文件导入 UXSDK 开源框架4.X 和 5.X 版本差异说明DJIKey差异…...
azkaban介绍
目录 为什么需要工作流调度系统 什么是azkaban azkaban适用场景 azkaban特点 常见的工作流调度系统 azkaban和Ooize特性对比 azkaban的架构 azkaban调度的任务有可能有那些类型 总结 为什么需要工作流调度系统 一个完整的大数据分析系统,必然由很多任务单…...
自学黑客(网络安全)必学内容
随着时代的发展,经济、社会、生产、生活越来越依赖网络。而随着万物互联的物联网技术的兴起,线上线下已经打通,虚拟世界和现实世界的边界正变得模糊。这使得来自网络空间的攻击能够穿透虚拟世界的边界,直接影响现实世界的安全。 …...
Java每日一练(20230518) 移除元素、跳跃游戏II、复原IP地址
目录 1. 移除链表元素 🌟 2. 跳跃游戏 II 🌟🌟 3. 复原 IP 地址 🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 移…...
diff命令和vimdiff命令
文章目录 diff命令基本用法选项示例 vimdiff命令命令格式选项说明常用操作 diff命令 diff命令是一个文本比较工具,用于比较两个文件的内容,它会逐行比较两个文件的内容并输出它们之间的差异。下面是diff命令的常用选项和用法: 基本用法 比…...
AcWing 797.差分(C++)
目录 1.题目描述 2.AC 1.题目描述 797.差分 输入一个长度为 nn 的整数序列。 接下来输入 mm 个操作,每个操作包含三个整数 l,r,cl,r,c,表示将序列中 [l,r][l,r] 之间的每个数加上 cc。 请你输出进行完所有操作后的序列。 输入格式 第一行包含两…...
Python每日一练(20230515) 只出现一次的数字 I\II\III
目录 1. 只出现一次的数字 Single Number 2. 只出现一次的数字 II Single Number II 3. 只出现一次的数字 III Single Number III 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 leetcod…...
基于【EasyDL】【图像分类】实现农作物病害识别小程序
内容、数据集来源:基于飞桨的农作物病害智能识别系统 - 飞桨AI Studio 项目背景 联合国粮食及农业组织的一份报告表明,每年农业生产的自然损失中有三分之一以上是由农业病虫害造成的,使这些成为当前影响农业生产和农业生产的最重要因素。需要考虑的农业…...
元宇宙又“死”了!Epic老板:你当6亿用户是摆设?
“扎克伯格花了数年时间试图让Metaverse成为现实,但现在它已被AI取代,并走向科技创意的坟墓。”一篇表达“元宇宙已死”的文章近期在推特上引发热议,而游戏制作公司Epic Games CEO Tim Sweeney的还击更是让这个话题热上加热。 “搞一次在线守…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...
在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...
初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...
uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)
UniApp 集成腾讯云 IM 富媒体消息全攻略(地理位置/文件) 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型,核心实现方式: 标准消息类型:直接使用 SDK 内置类型(文件、图片等)自…...
LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别(二)
在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…...
