当前位置: 首页 > news >正文

算法day1 dfs搜索2题

一   火星人 

 拿到这种类似于排序的,这个就好比如我们之前学习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;
}

总结:

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

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

相关文章:

  • 智绘教:Windows平台上的高效悬浮窗画笔工具深度解析
  • mac 安装Eclipse,汉化及安装ERMaster
  • 搜索赋能:大型语言模型的知识增强与智能提升
  • mamba,mamba2环境搭建
  • # C/C++右移高位补0还是1?
  • eclipse配置Spring
  • 数据安全_笔记系列07:数据泄露防护(DLP)(监控与阻断敏感数据外泄)深度解析
  • AI创作教程:用deepseek和猫箱做互动故事游戏
  • NLP的预处理数据
  • 磁盘使用LVM方式挂载目录
  • 【xinference 词嵌入】embbeding 使用教程
  • 大白话Vue 双向数据绑定的实现原理与数据劫持技术
  • 【10】RUST的迭代器与闭包
  • Proof Beyond Boundaries: Hong Kong zkNight 活动精彩回顾
  • 零样本学习 zero-shot
  • LeetCodehot 力扣热题100 全排列
  • 《Keras 3 使用 PointNet 进行点云分类》:此文为AI自动翻译
  • Ubuntu指令(一)
  • SVT-AV1接入ffmpeg说明
  • SSM和SpringBoot有什么区别?
  • 92岁上海交大退休教师捐赠百万元给学校,其父也曾设奖学金
  • 外交部:各方应为俄乌双方恢复直接对话创造条件
  • 车载抬头显示爆发在即?业内:凭借市场和产业链优势,国内供应商实现反超
  • 外交部:反对美方人士发表不负责任谬论
  • 2025年中国网络文明大会将于6月10日在安徽合肥举办
  • 中保协发布《保险机构适老服务规范》,全面规范保险机构面向老年人提供服务的统一标准