蓝桥杯-粘木棍-DFS

news/2024/7/20 22:18:20 标签: 深度优先, 蓝桥杯, 算法, c++

题目

思路

--有n根木棍,需要将其粘成m根木棍,并求出最小差值,可以用DFS枚举出所有情况。粘之前有n根短木棍,粘之后有m根长木棍,那么让长木棍的初始长度设为0。外循环让所有的短木棍都参与粘,内循环让要粘的短木棍选择某个长木棍。再结合DFS进行n层递归,每层都粘一个短木棍,并且下一层要将已经粘过的排除掉。

--递归时最好不要用sort排序,很有可能会影响其他层的递归。

代码

#include <iostream>
#include <cmath>
using namespace std;

int a[7];
int b[7] = {0}; //长木棍,由短木棍拼接而成,拼接前长度设为0 
bool v[7] = {false};
int n, m;
int mincha = 30000; //便于求出最小的差值

void dfs(int s){
    if (s == n){
        int minb, maxb;
        minb = maxb = b[0];
        for (int i = 0; i < m; i++){
            minb = min(minb, b[i]);
            maxb = max(maxb, b[i]);
        }
        int cha = maxb - minb;
        mincha = min(mincha, cha); //更新mincha
        return;
    }
    else{
        for (int i = s; i < n; i++){
            for (int j = 0; j < m; j++){
                if (v[i] == false){ //标记短木棍是否已被分配给长木棍 
                    v[i] = true;
                    b[j] += a[i];
                    dfs(s + 1);
                    v[i] = false;
                    b[j] -= a[i];
                } 
            }
        } //外层循环是短木棍,内层是长木棍,让每根短的都有机会粘到长的上面,枚举出所有可能的况。 
    }
}

int main(){
    cin >> n >> m;
    for (int i = 0; i < n; i++){
        cin >> a[i];
    }
    dfs(0);
    cout << mincha << endl;
    
    return 0;
}
/*
    不能对数组b用sort排序,会改变b的顺序。单看改变b的顺序对这层递归没有什么影响,但是对其它层的递归有影响。 
*/

 


http://www.niftyadmin.cn/n/5428587.html

相关文章

区块链技术的革命性影响

1. 区块链技术的基本原理&#xff1a; 区块链是一种去中心化的分布式数据库技术&#xff0c;通过不断增长的记录&#xff08;块&#xff09;构成一个链式结构。每个区块包含了交易数据的加密信息以及上一个区块的哈希值&#xff0c;从而形成了不可篡改的交易记录。这种去中心化…

2024自动化测试的痛点与发展趋势!

前几天在技术交流群里&#xff0c;大家讨论了很多关于自动化测试落地面临的痛点和如何创造价值的话题&#xff0c;颇有感触。 自动化测试这个话题&#xff0c;从出现到在国内大规模开展实践&#xff0c;有很长的一段时间了。早期&#xff0c;大家对自动化测试的理解和使用目的…

代码随想录算法训练营day14 | 二叉树的递归遍历、二叉树的迭代遍历、二叉树的统一迭代

今天开始二叉树的学习。 关于二叉树的理论基础&#xff0c;可以参考&#xff1a; 链接: 二叉树理论基础 目录 二叉树的递归遍历写递归的思路二叉树的前序遍历二叉树的中序遍历二叉树的后序遍历 二叉树的迭代遍历二叉树的前序遍历二叉树的中序遍历二叉树的后序遍历 二叉树的统…

20240313-算法复习打卡day22||● 235. 二叉搜索树的最近公共祖先 ● 701.二叉搜索树中的插入操作 ● 450.删除二叉搜索树中的节点

235. 二叉搜索树的最近公共祖先 根据二叉搜索树的顺序特点进行递归 class Solution { public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {if (root->val > p->val && root->val > q->val) {return lowestCommonAn…

TimescaleDB-2 创建超表以及超表的优化

创建超表 -- 创建普通表 CREATE TABLE hxdcs_cnc_data (time TIMESTAMPTZ NOT NULL,device_id int NOT NULL,state smallint,original_data text );-- 创建超表 SELECT create_hypertable(hxdcs_cnc_data, time);--创建唯一索引 CREATE UNIQUE INDEX idx_cnc_data_deviceid_t…

【FPGA】DDR3学习笔记(二)丨从SDRAM到DDR3的IP核设计

本篇文章包含的内容 一、DDR SDRAM1.1 基本概述1.2 工作时序&#xff08;以读取为例&#xff09; 二、DDR2 SDRAM2.1 基本概述2.2 工作时序 三、DDR3 SDRAM3.1 基本概述3.2 硬件设计3.3 读写时序3.4 MIG IP核设计3.5 读写代码设计 开发板&#xff1a;正点原子的达芬奇开发板&am…

界面开发框架DevExpress XAF v24.1新版预告 - 跨平台应用UI(二)

DevExpress XAF是一款强大的现代应用程序框架&#xff0c;允许同时开发ASP.NET和WinForms。XAF采用模块化设计&#xff0c;开发人员可以选择内建模块&#xff0c;也可以自行创建&#xff0c;从而以更快的速度和比开发人员当前更强有力的方式创建应用程序。 本文中的内容概述了…

授时小知识——北斗卫星时钟信号和GPS卫星信号谁更强?

北斗卫星时钟信号好还是GPS信号更胜一筹呢&#xff1f;下面小编带大家一起来比较一下看看吧。 1. 系统覆盖范围 北斗卫星导航系统是中国自主研发的授时定位系统&#xff0c;其覆盖范围包括全球各个地区。但在海外地区&#xff0c;主要还是东南亚、南亚、中亚等地区&#xff0c;…