算法day1 dfs搜索2题

ops/2025/2/27 6:01:13/

一   火星人 

 拿到这种类似于排序的,这个就好比如我们之前学习dfs基础的时候里面的指数型枚举

指数型枚举数据与数据之间没有任何枚举,就比如选这个数字与不选
组合型枚举数据与数据之间有联系,下一个数字不可以给上一个数字
排列型枚举数据与数据之间有联系,下一个数字比上一个数字加1

 所以我们刨析这个题目也就是这样我们以它的例子来讲解
也就是这样的一个排序方式
那我们这种,首先是每个数据与每个数据是有关系的,其次就是这个这个每次的对应的值都不可以给上一个,那么这种就是组合型枚举

我们就用之前所学过的组合型枚举来敲一遍代码

#include<stdio.h>
#include<algorithm>
#include<cstring>
using namespace std;const int N=10010;
int m;           //手指数
int n;           //加的位数
int res=0;         //记录加的次数
int ans[N];      //答案寄存数组
int mas[N];      //火星人所给的数字
int st[N]={0};   //表示状态数
bool return0 = false;void dfs(int x){if(return0 == true){return ;}if(x>m){res++;if(res==n+1){for(int i=1;i<=m;i++){printf("%d ",ans[i]);}return0 = true;}return;}for(int i=1;i<=m;i++){if(res==0){i=mas[x];}if(st[i]==0){ans[x]=i;st [i]=1;dfs(x+1);ans[x]=0;//清理现场st [i]=0;}}
}int main(){scanf("%d",&m);scanf("%d",&n);for(int i=1;i<=m;i++){scanf("%d",&mas[i]);}dfs(1);return 0;
}

 我们这里写了一个减枝的操作前面的return0这个是用来减枝的,因为最后会有数据过不去

二  烤鸡

 我们来分析这个题目,这个题目是有很多的烤鸡的调料,然后有10种调料,这每个调料都是有对应的3个不同重量的,然后我们输入一个重量,然后剩下的调料的重量要等于这个重量
我们这里就是指数型枚举,3个重量都有选择或者不选择,但是这里一定要有10种调料的种类
 

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;const int N = 20;int n;
int ret;
int ans[N];
int mem[59055][N];void dfs(int x,int sum){if(sum>n) return;    //减枝if(x>10){if(sum==n){ret++;for(int i=1;i<=10;i++){mem[ret][i]=ans[i];}}return ;}for(int i=1;i<=3;i++){ans[x]=i;dfs(x+1,sum+i);ans[x]=0;}}int main(){scanf("%d",&n);dfs(1,0);printf("%d\n",ret);for(int i=1;i<=ret;i++){for(int j=1;j<=10;j++){printf("%d ",mem[i][j]);}printf("\n");}return 0;
}

总结:

我们在思考指数型枚举的时候,这里我们一般是不需要记忆数组的,因为我们就只有选择或者不选择,所以我们在递归的时候,就已经存在了选择和不选择,因为是深度优先搜索,最后要恢复现场,但是这个指数型有时候也是需要的,其实这里的烤鸡这个体题也是可以像我们之前写那个指数化枚举一样加一个记忆数组

我们在思考组合型枚举的时候,我们是需要记忆数组的,因为我们最开始分析的时候是由位置进行分析的,是否要放到这个位置,如果放了就要进行赋值,表示这个位置进行放了值,不会再在这里放值


http://www.ppmy.cn/ops/161602.html

相关文章

基于Spring Boot的公司资产网站设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

设计模式 简单汇总

设计模式是软件工程中广泛使用的一套解决方案&#xff0c;用于解决常见问题并提高代码的质量。它们分为创建型、结构型和行为型三类&#xff0c;共23种模式。以下是各类别及其常见模式的详细说明&#xff1a; 目录 创建型模式结构型模式行为型模式 创建型模式 这些模式关注对象…

【第九节】C++设计模式(结构型模式)-Composite(组合)模式

目录 一、问题提出 二、模式结构 三、代码实现 三、总结 一、问题提出 组合模式&#xff1a;构建树形结构的统一解决方案 在软件开发中&#xff0c;我们经常需要处理树状的递归结构&#xff08;例如文件系统、组织架构等&#xff09;。这类场景中&#xff0c;组合模式&…

WPS接入私有化DeepSeek大语言模型

文章目录 1.安装officeAI软件1.1登录官网下载officeAI 2.officeAI相关配置2.1启动WPS第三方COM功能2.2接入本地ollama服务2.3演示示例 1.安装officeAI软件 OfficeAI 助手是一项专为 Microsoft Office 和 WPS 用户打造的智能办公工具软件&#xff0c;旨在解决多种常见办公问题。…

Deep seek学习日记1

Deepseek最强大的就是它的深度思考&#xff0c;并且展现了它的思考过程。 五种可使用Deep seek的方式&#xff08;应该不限于这五种&#xff0c;后续嵌入deepseek的应该更多&#xff0c;多了解一点因为官网容易崩~~&#xff09;&#xff1a; 1.deep seek官网 2.硅基流动silicon…

python的Tkinter小程序上传Excel并下载Text

实现一个图形化的Excel到文本文件转换工具&#xff0c;用户可以通过上传Excel文件并选择特定的列和行来生成一个文本文件。以下是详细的代码功能、使用的技术以及每一部分的详细注释&#xff1a; 1.功能概述 上传Excel文件&#xff1a;用户可以选择一个Excel文件进行上传。 选…

Linux相关概念和易错知识点(30)(线程互斥、线程同步)

目录 1.线程互斥 &#xff08;1&#xff09;临界资源和临界区 &#xff08;2&#xff09;互斥和原子性 ①互斥 ②原子性 &#xff08;3&#xff09;加锁和解锁&#xff08;互斥锁&#xff09;的原理 &#xff08;4&#xff09;pthread_mutex系列函数和变量 ①lock、unlo…

【自学笔记】Spring Boot框架技术基础知识点总览-持续更新

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 Spring Boot框架技术基础知识点总览一、Spring Boot简介1.1 什么是Spring Boot&#xff1f;1.2 Spring Boot的主要特性 二、Spring Boot快速入门2.1 搭建Spring Boo…