DFS刷题(25.3.13)

题目1——烤鸡

题目描述

在这里插入图片描述

题解

这是一个简单的暴搜题目,由于一共由10种配料,每种配料可以放1到3克,因此只需要用dfs对每种配料放入的质量进行暴力搜索即可,如果放入的配料质量之和等于题目给出的美味程度 n n n,记录一下,最终将所有得到的符合题目要求的答案输出一遍。
代码

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;int n;
int res[N][10];
int temp[10];
int idx;void dfs(int u, int sum)
{if(u == 10){if(sum == n){for(int i = 0; i < 10; i ++)res[idx][i] = temp[i];idx ++;}return ;}// 枚举for(int i = 1; i <= 3; i ++){// 选择itemp[u] = i;dfs(u + 1, sum + i);}
}
int main()
{ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);cin>>n;dfs(0, 0);if(idx){cout<<idx<<'\n';for(int i = 0; i < idx; i ++){for(int j = 0; j < 10; j ++)cout<<res[i][j]<<' ';cout<<'\n';}}else{cout<<"0"<<'\n';}return 0;
}

题目2——外星人

题目描述

在这里插入图片描述
在这里插入图片描述

题解

乍一看题目感觉很复杂,但看了样例手动模拟了一下之后发现就是简单的排列组合,即给定一组数(输入的第三行),从这组数开始,按照从小到大(数字的大小)进行全排列第 M M M次后的结果。

题目样例
1 2 3 4 5   ——   原始序列
1 2 3 5 4   ——   第一次排列得到的序列
1 2 4 3 5   ——   第二次排列得到的序列
1 2 4 5 3   ——   第三次排列得到的序列( M = 3 M = 3 M=3

也就是说,我们以给定的初始序列为起点,使用dfs进行全排列,排列到第 M M M次的时候输出答案,退出即可
代码

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;int n, m, num;  //num记录第几次
int figure[N];
int temp[N];
bitset<N> bt;void dfs(int u)
{// 找到一种排列if(u == n){num ++;if(num == m + 1) // 第一次找到排序是原始序列 因此要找m+1次{for(int i = 0; i < n; i ++)cout<<temp[i]<<' ';exit(0);}return ;}for(int i = 1; i <= n; i ++){if(num == 0) i = figure[u];  // 从指定位置开始搜索if(!bt[i]){bt[i] = true;temp[u] = i;dfs(u + 1);// 恢复现场bt[i] = false;}}
}
int main()
{ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);cin>>n>>m;for(int i = 0; i < n; i ++) cin>>figure[i];dfs(0);return 0;
}

题目3——火柴棒等式

题目描述

在这里插入图片描述

题解

首先阅读题目,总的来说就是找到ABC三个数字,要求满足:

  • A + B = C A + B = C A+B=C
  • 三个数字使用的火柴棒总数为n - 4(加号和等号一共要消耗4个火柴棒)

对于这种题目,我们可以对每个位置(A、B、C 一种三个位置)上可以选择的数字进行爆搜,每次搜索完之后检查找到的三个数字是否满足以上的两个条件
由于ABC可能会为两位数或者三位数,因此我们还要开一个数组(dic)来维护每个数字需要多少根火柴棒,这里我使用了记忆搜索的思想,即如果dic[x]x为数字)在之前使用过,则记录下来;如果没使用过,则计算后再保存下来,方便下次调用时使用。具体代码如下所示:

int dic[1005] = {6, 2, 5, 5, 4, 5, 6, 3, 7, 6};
int cal(int x)
{if(dic[x] > 0) return dic[x];int sum = 0, t = x;
//	cout<<t<<'\n';while(x){sum += dic[x % 10];x /= 10;}dic[t] = sum;return sum;
}

整体代码

#include<bits/stdc++.h>
using namespace std;
const int N = 30;int n;
int dic[1005] = {6, 2, 5, 5, 4, 5, 6, 3, 7, 6};
int temp[N];
int res;int cal(int x)
{if(dic[x] > 0) return dic[x];int sum = 0, t = x;
//	cout<<t<<'\n';while(x){sum += dic[x % 10];x /= 10;}dic[t] = sum;return sum;
}
void dfs(int u, int sum)
{if(sum > n) return ;if(u == 3){if((temp[0] + temp[1] == temp[2]) && sum == n)res ++;return ;}for(int i = 0;  i <= 1000; i ++){temp[u] = i;  // 第u个位置选择idfs(u + 1, sum + cal(i));}
}
int main()
{ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);cin >> n; n -= 4;dfs(0, 0);cout<<res;return 0;
}

题目4——PERKET

题目描述

在这里插入图片描述

题解

这道题目也比较简单,是一种指数类问题,即大致思路就是对每一种配料选和不选进行暴力搜索,最后维护一下最小的酸度和苦度的绝对值即可。
注意由于题目所述必须至少添加一种配料,因此每次枚举完所有的配料选择方案时,要加一个判断,把一种配料都不选的方案筛掉。
代码

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 20;ll n;
ll s[N], b[N];
int bt[N];
ll res = 1e9;void dfs(int u)
{if(u == n){int sum = 0;for(int i = 0; i < n; i ++) sum += bt[i];if(sum == 0) return;  // 一种材料都没选ll ss = 1, bb = 0;for(int i = 0; i < n; i ++){if(bt[i]) ss *= s[i];bb += bt[i] * b[i];}res = min(res, abs(ss - bb));return ;}// 选择第u种材料bt[u] = 1;dfs(u + 1);// 不选择第u种材料bt[u] = 0;  //恢复现场dfs(u + 1);
}int main()
{ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);cin>>n;for(int i = 0; i < n; i ++){cin>>s[i];  cin>>b[i];}dfs(0);cout<<res;return 0;
}

题目5——奇怪的电梯

题目描述

在这里插入图片描述

题解

这道题刚上来觉得很复杂,但仔细想了一下之后,就是一个简单的dfs,从楼层a开始,分别搜索上行和下行两种方案,最终看能不能到达楼层b,注意不要忘记判断楼层是否合法
!!!但是这样会TLE
于是后来我进行了优化(参考洛谷题解里的大佬hhh),即使用一个数组去维护从楼层a开始,到当前楼层的最短距离,根据这个数组进行剪枝。举个例子:

假如我们第一次到达楼层c,此时按按钮的次数为3,由于这是第一次到达楼层c,因此我们把这个数字记录下来;
而当我们再后续搜索时,再次到达了楼层c,按按钮的次数为9,因为9 > 3,肯定得不到最优解,因此剪枝

代码

#include<bits/stdc++.h>
using namespace std; 
const int N = 210;int n, a, b;
int k[N], dic[N];
int res = 0x3f3f3f3f;// u代表当前是第几层 num 是按电梯次数
void dfs(int u, int num)  
{// 越界if(u > n || u <= 0) return ;// 不是最优if(num >= dic[u]) return ;else dic[u] = num;if(num > res) return ;// resif(u == b){res = min(res, dic[u]);}// 向上dfs(u + k[u], num + 1);// 向下dfs(u - k[u], num + 1);return ;
}
int main()
{ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);cin>>n>>a>>b;for(int i = 1; i <= n; i ++) cin>>k[i];memset(dic, 0x3f, sizeof(dic));dfs(a, 0);  // 从a楼开始if(res == 0x3f3f3f3f) cout<<"-1"<<'\n';else cout<<res;return 0;
}

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

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

相关文章

C#中除了Dictionary,List,HashSet,HashTable 还有哪些可以保存列表的数据类型?

在 C# 中&#xff0c;除了 Dictionary、List、HashSet 和 Hashtable 之外&#xff0c;还有许多其他可以保存列表或集合类型的数据结构&#xff0c;具体包括以下几类&#xff1a; &#x1f4cc; 数组类 1. Array&#xff08;数组&#xff09; 固定长度&#xff0c;性能高&…

《Python实战进阶》第21集:数据存储:Redis 与 MongoDB 的使用场景

第21集&#xff1a;数据存储&#xff1a;Redis 与 MongoDB 的使用场景 摘要 在现代应用开发中&#xff0c;数据存储的选择直接影响系统的性能、扩展性和成本。Redis 和 MongoDB 是两种极具代表性的数据库技术&#xff0c;它们分别擅长解决不同场景下的问题。本文将深入探讨 Re…

三视图转stl导出 空心面片体 networkx shapely triangle numpy-stl

from shapely.geometry import Polygon import triangle from shapely.ops import unary_union from stl import mesh import numpy as np from collections import defaultdict from 三维投影线段寻找 import get_adjusted_clusters,get_clusters,get_intersect_lines import …

大摩闭门会:250312 学习总结报告

如果图片分辨率不足&#xff0c;可右键图片在新标签打开图片或者下载末尾源文件进行查看 本文只是针对视频做相应学术记录&#xff0c;进行学习讨论使用

【51单片机】程序实验15.DS18B20温度传感器

主要参考学习资料&#xff1a;B站【普中官方】51单片机手把手教学视频 开发资料下载链接&#xff1a;http://www.prechin.cn/gongsixinwen/208.html 单片机套装&#xff1a;普中STC51单片机开发板A4标准版套餐7 目录 DS18B20介绍主要特性内部结构控制时序初始化时序写时序读时序…

ESP32芯片模组方案,设备物联网无线通信,WiFi蓝牙交互控制应用

在当下&#xff0c;物联网正以前所未有的速度席卷全球&#xff0c;从繁华都市的智能建筑&#xff0c;到宁静乡村的智慧农业&#xff0c;从人们日常使用的可穿戴设备&#xff0c;到工业领域复杂精密的自动化生产线&#xff0c;物联网的触角已深入到生活与生产的每一个角落。 而…

Linux第二次练习

1.首先在根下面创建一个名为text的目录 2.在根目录下新建一个text目录&#xff0c;然后在text目录中新建上图的一级目录、二级目录以及三级目录 3.显示/text目录下文件的树形拓扑图 4.将linux树状结构图中列出的所有文件用ll命令列出来

百鸡问题-

百鸡问题 #include<stdio.h> int main(){int n;scanf("%d",&n);int x,y,z;for(x0;x<100;x){for(y0;y<100;y){for(z0;z<100;z){if((x*15y*9z)<(3*n) && ((xyz)100)){printf("x%d,y%d,z%d\n",x,y,z);}}}}return 0; }

LVDS(Low Voltage Differential Signaling)电平详解

一、LVDS的定义与核心特性 LVDS&#xff08;低压差分信号&#xff09;是一种 低功耗、高速、抗干扰 的差分信号传输技术&#xff0c;通过一对互补的电压信号&#xff08;正负端差值&#xff09;传递数据。其核心特性包括&#xff1a; 电气特性 电压摆幅&#xff1a;差分电压约…

【OpenFeign 面试专题】

OpenFeign 面试专题 OpenFeign 的核心原理OpenFeign 如何与 Ribbon、Hystrix 集成Ribbon的负载均衡策略如何自定义 OpenFeign 的请求编码和响应解码OpenFeign 如何传递请求头&#xff08;Header&#xff09;信息OpenFeign 如何处理超时和重试OpenFeign 支持哪些 HTTP 客户端实现…

Adobe Acrobat Pro setting

防火墙断网组织弹窗 Adobe软件突然弹窗“THIS APP HAS BEEN DISABLED”&#xff1f;别慌&#xff0c;几步教你轻松解决&#xff01; 禁用代理 解决Adobe出现This unlicensed Photoshop app has been disabled.禁止使用 rules:- DOMAIN-KEYWORD,adobe,REJECT

搜索插入位置(js实现,LeetCode:35)

给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,3,5,6], target 5 输出: 2示例 2: 输入…

5. 前后端实现文件上传与解析

1. 说明 在实际开发中&#xff0c;比较常见的一个功能是需要在前端页面中选择系统中的某个文件上传到服务器中进行解析&#xff0c;解析后的文件内容可以用来在服务器中当作参数&#xff0c;或者传递给其它组件使用&#xff0c;或者需要存储到数据库中。所以本文就提供一种方式…

《灵珠觉醒:从零到算法金仙的C++修炼》卷三·天劫试炼(32)万剑归宗破妖阵 - 最长递增子序列(LIS)

《灵珠觉醒:从零到算法金仙的C++修炼》卷三天劫试炼(32)万剑归宗破妖阵 - 最长递增子序列(LIS) 哪吒在数据修仙界中继续他的修炼之旅。这一次,他来到了一片神秘的万剑谷,谷中有一座巨大的万剑归宗剑阵,剑阵闪烁着神秘的光芒。谷口有一块巨大的石碑,上面刻着一行文字:…

【redis】使用redis作为缓存时所注意事项

缓存更新策略 在 Redis 缓存中&#xff0c;缓存的更新策略主要有**定期生成&#xff08;定时更新&#xff09;和实时生成&#xff08;即时更新&#xff09;**两种方式。不同的策略适用于不同的业务场景&#xff0c;涉及性能、数据一致性和系统负载等方面的权衡。 1. 定期生成&…

计算机网络:计算机网络的分类

按分布范围分类&#xff1a;广域网&#xff0c;城域网&#xff0c;局域网&#xff0c;个域网 按传输技术分类&#xff1a;广播式网络&#xff0c;点对点网络 按拓扑结构分类&#xff1a;总线型&#xff0c;环形&#xff0c;星形&#xff0c;网状 按传输介质分类&#xff1a;…

解决pip安装uv时下载速度慢

验证优化效果 方案 1&#xff1a;临时使用国内镜像源&#xff08;推荐&#xff09; pip install uv -i https://pypi.tuna.tsinghua.edu.cn/simple 速度提升&#xff1a;镜像源服务器位于国内&#xff0c;带宽充足&#xff0c;通常可达 1-10MB/s 支持源列表&#xff1a; # 清…

SpringCloud Alibaba——入门简介

一、是什么 &#xff08;1&#xff09;诞生 2018.10.31&#xff0c;Spring Cloud Alibaba 正式入驻了 Spring Cloud 官方孵化器&#xff0c;并在 Maven 中央库发布了第一个版本 &#xff08;2&#xff09;介绍 &#xff08;3&#xff09;&#xff1f;何为必须组件 二、能干嘛…

Python完全指南:从基础到实践的编程艺术

引言&#xff1a;数字时代的瑞士军刀 在人工智能与大数据浪潮中&#xff0c;Python如同编程世界的"瑞士军刀"&#xff0c;以其优雅的语法和强大的生态征服全球开发者。本文将从语言哲学到实战应用&#xff0c;为您展开Python编程的全景画卷&#xff0c;揭示这门语言…

Docker 运行 GPUStack 的详细教程

GPUStack GPUStack 是一个用于运行 AI 模型的开源 GPU 集群管理器。它具有广泛的硬件兼容性&#xff0c;支持多种品牌的 GPU&#xff0c;并能在 Apple MacBook、Windows PC 和 Linux 服务器上运行。GPUStack 支持各种 AI 模型&#xff0c;包括大型语言模型&#xff08;LLMs&am…