首页 > 编程语言 >C++ | 剪枝(DFS)lanqiao OJ 2942

C++ | 剪枝(DFS)lanqiao OJ 2942

时间:2024-03-25 11:29:35浏览次数:24  
标签:剪枝 cnt OJ int dfs dep DFS

 上一篇我们已经分享了DFS的学习,剪枝相当于对部分DFS进行优化

正常用DFS写,会遍历每一种情况,因此要判断他的合法性,并且在第十个检测点会超时,用剪枝后,这道题就可以过啦。

//不剪枝的方法

#include <bits/stdc++.h>
using namespace std;

const int N = 15;
int a[N], n;

vector<int> v[N];

//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 + n + 1);
  for (int i = 1; i <= n; i ++) 
  {
    if (dfs(i, 1))
    {
      cout << i << '\n';
      break;
    }
  }

  return 0;
}

以下是经过剪枝的算法

#include <bits/stdc++.h>
using namespace std;

const int N = 15;
int a[N], n;

vector<int> v[N];

//cnt表示队伍数量,dfs返回在cnt个队伍的情况下是否可以成功分队
bool dfs(int cnt, int dep)
{
  if (dep == n + 1)
  {
    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 + n + 1);
  for (int i = 1; i <= n; i ++) 
  {
    if (dfs(i, 1))
    {
      cout << i << '\n';
      break;
    }
  }

  return 0;
}

标签:剪枝,cnt,OJ,int,dfs,dep,DFS
From: https://blog.csdn.net/lly18435759909/article/details/137008549

相关文章

  • 登山小分队(dfs,模拟)
    原题链接:题目描述Foxity和他的好友们相约去爬山,但是他们每个人都来到了不同的山脚下。整个山的结构类似一棵"树",有很多的观光节点通过一条条山道连接起来。在图论中,树是一种无向图,其中任意两个顶点之间存在唯一一条路径。或者说,只要没有回路的连通图就是树。这个问题中,我们......
  • BZOJ2908 又是nand
    BZOJ2908又是nand首先手玩需要计算的值,发现既不满足交换律也不满足结合律,不好维护。对于位运算,常见的考虑分开每一位计算贡献,对于单独一位,计算较为简单。既然计算的值只能按顺序计算,那我们只能考虑树剖(其他数据结构不好维护顺序)。给每一位建一棵线段树,在线段树上维护。注意到......
  • 【CUMTOJ】法师康工人(代码细节控制)
    题目描述代码#include<bits/stdc++.h>usingnamespacestd;classworker{ public: intstart; intend; worker(){ } worker(inta,intb){ start=a;end=b; }};boolcmp(workerw1,workerw2){ returnw1.start<w2.start;}intmai......
  • 最近的学习笔记YBTOJ
    写在前面:洛谷月赛太烂了,或者说,效率太低了,所以来写总结你好!开学了,平凡的我回到了平凡的世界不得不承认,在学校还是很好的不仅有生活,还有OI最近的OI学习总是围绕着数据结构这个我最烂的板块来讲不知道是不是对我不努力的报复有两位巨佬停课了,实名表示羡慕语文作业是真的不想......
  • CMU15445 2022fall project3
    CMU154452022fallproject3project3相对project2的b+树来说简单太多了,整体没有什么痛苦的debug,基本就看看其他算子的实现参考一下,很快就能写出来。Task1-AccessMethodExecutorsSeqScan首先我们需要知道:init是做一些初始化工作的,next是留给上层节点调用的,SeqScanExecuto......
  • 机器学习——决策树(四)后剪枝
    观前提示:这是本人决策树相关的第四篇博文,前3篇的内容如下:1、建造训练集的决策树【完成结点类编写和建树过程】2、用验证集评估模型、选出泛化较好的数据划分方式训练模型3、预剪枝读者可根据需要从上方《机器学习》专栏中查阅对应文章第四章是后剪枝的内容,用到了许多前文......
  • DFS求解连通块问题
    DFS求解连通块问题#include<bits/stdc++.h>usingnamespacestd;charg[35][65];intvis[35][65],num,res;intdx[]={0,1,0,-1},dy[]={1,0,-1,0};voiddfs(intx,inty){if(x<1||x>30||y<1||y>60||g[x][y]=='0'||vis[x][y])return;vis[x][......
  • Microsoft办公软件全家桶下载,office/visio/project百度云资源
    Office/visio/project均是由Microsoft公司开发的一套办公软件套装。它包括多个应用程序,主要用于处理办公室中的各种任务,如文字处理、电子表格、演示文稿、电子邮件和数据库管理等。Office2021更新最大的前五个功能:Excel中的动态数组(一个公式返回多个单元格)Excel中的XLO......
  • djangoJAVA汽车年审管理系统(源码+mysql+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取本课题的源码和程序系统程序文件列表系统的选题背景和意义选题背景:随着汽车产业的快速发展,汽车已经成为人们日常生活中不可或缺的交通工具。然而,随着汽车数量的增加,汽车安全问题也日益凸显。为了确保道路交通安全,各国政府都......
  • BZOJ5223-有理有据题
    BZOJ5223-有理有据题题目大意给你\(m\)条线段\((a_i,b_i)\),再给\(n\)个区间\([l_i,r_i]\),\(q\)次操作,\(\texttt{Axy}\)添加一条线段\((x,y)\),其编号为最后一条线段加一。\(\texttt{Cx}\)查询\([l_x,r_x]\)和线段有交集(在边界点也算)的最长编号区间。\(\texttt......