AcWing 165. 小猫爬山(DFS + 剪枝优化)

news2024/9/25 6:30:13

AcWing 165. 小猫爬山(DFS + 剪枝优化)

  • 一、问题
  • 二、分析
    • 1、贪心想法的误区
    • 2、正解
  • 三、代码

一、问题

在这里插入图片描述

二、分析

这道题其实总结下来,就是一句话,让更多的小猫坐在一辆车上,从而减少车的数量。

1、贪心想法的误区

这道题第一眼看过去,其实可能会认为这是一个贪心的题目。

那么我们看看贪心错在哪里?

既然让更多的猫坐在车上,那么我可以从小到大排序,接着从小到大开始枚举,如果不能放到当前车上,那么就再购买一辆新的车,这样就能尽可能的把轻的小猫放到车上,不让重的猫占地方。

那么这么做最后发现过不了这道题,为什么呢?

这个贪心想法其实是错误的。

简单地想一下,可能一只很重的猫,占了车所能承受的最大重量的百分之80,那么剩下的空余的百分之20,其实我们可以用重量小的猫填充。

比如我们举个例子:
车辆所能携带的最大重量是 8。
2, 2, 3,1,1, 1, 1, 6, 6, 6

如果按照贪心的想法,我们的方案如下:
(1,1,1,1,2,2),(3),(6),(6),(6)---->5

但实际上,我们可以这样:
(6,1,1),(6,2),(6,1,1),(3)---->4

因此,这种贪心想法是错误的。

2、正解

既然贪心不能做的话,我们只能采用暴力枚举的方式去做了。

其实这道题由于数据的范围是非常小的,像这种非常小的数据范围,往往是指数级别的算法,即我们的DFS。

而贪心的题目,往往是暴力枚举会超时,只能采用贪心的策略去观察性质,从而减少时间的花费。

暴力枚举的话,思路就比较简单。

对于一只猫而言,它只有两个大的选择,上之前的猫所在的某一辆车,或者自己再新开一辆车。

但是,这个时间复杂度其实还是挺高的。

那么我们怎么来优化一下呢?

我们知道,DFS的话会去枚举所有情况,然后选出最优解。

而每一个选择的背后都是一个子树。而子树越多,我们搜索的时间越长,越容易超时。

因此,我们需要尽可能的让这些猫的选择少一些,从而优化我们的算法。

这样的话,我们就可以从体重最重的猫开始枚举。这样做的好处是什么呢?

由于这些猫的体重很大,所以留给后面的猫的空间就很小,那么大概率后面的猫是无法坐到当前车上的。从而减少了猫的选择,进而优化了我们的搜索过程。

而这个优化的过程就是我们的剪枝优化

三、代码

#include<bits/stdc++.h>
using namespace std;
const int N = 20;
typedef long long ll;
int n, w;
int c[N];
int ans = N;
bool st[N];
ll sw[N];
bool cmp(int x, int y)
{
    return x >y;
}
void dfs(int u, int nums)
{
    if(u == n)
    {
        ans = min(ans, nums);
        return;
    }
    if(nums >= ans)return;
    int cnt = 0;
    for(int i = 1; sw[i] != 0; i ++ )
    {
        if(sw[i] + c[u] <= w)
        {
            sw[i] += c[u];
            dfs(u + 1, nums);
            sw[i] -= c[u];
        }
        cnt ++;
    }
    sw[cnt + 1] = c[u];
    dfs(u + 1, cnt + 1);
    sw[cnt + 1] -= c[u];
}

void solve()
{
    cin >> n >> w;

    for(int i = 0; i < n; i ++ )
        cin >> c[i];

    sort(c, c + n, cmp);

    dfs(0, 0);
    cout << ans << endl;
}

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    solve();
    return 0;
}

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

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

相关文章

Spring Security in Action 第四章 SpringSecurity处理密码的相关讨论

本专栏将从基础开始&#xff0c;循序渐进&#xff0c;以实战为线索&#xff0c;逐步深入SpringSecurity相关知识相关知识&#xff0c;打造完整的SpringSecurity学习步骤&#xff0c;提升工程化编码能力和思维能力&#xff0c;写出高质量代码。希望大家都能够从中有所收获&#…

Java面试——maven篇

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

以太坊数据开发-Web3.py-安装连接以太坊数据

Web3.py是连接以太坊的python库&#xff0c;它的API从web3.js中派生而来。如果你用过web3.js&#xff0c;你会对它的API很熟悉。但惭愧的是&#xff0c;作为一个以太坊上Dapp的开发者&#xff0c;我几乎没有直接使用过web3.js&#xff0c;也没有看过它的API。 官网&#xff1a…

STL——queue

一、queue介绍和使用 1.queue文档介绍 &#xff08;1&#xff09;队列是一种容器适配器&#xff0c;专门用于在FIFO上下文&#xff08;先进先出&#xff09;中操作&#xff0c;其中从容器的一端插入元素&#xff0c;另一端提取元素。 &#xff08;2&#xff09;队列是作为容…

ImageMagick任意文件读取漏洞(CVE-2022-44268)

0x00 前提 前几天爆出一个 ImageMagick 漏洞 &#xff0c;可以造成一个任意文件读取的危害比较可观&#xff0c;最近有时间来复现学习一下 主要是影响的范围很大&#xff0c;很多地方都有这个问题&#xff0c;需要来学习一下 0x01 介绍 ImageMagick 是一个免费的开源软件套…

【计组】设计大型DMP系统--《深入浅出计算机组成原理》(十四)

目录 一、DMP&#xff1a;数据管理平台 二、MongoDB 真的万能吗 三、关系型数据库&#xff1a;不得不做的随机读写 &#xff08;一&#xff09;Cassandra&#xff1a;顺序写和随机读 1、Cassandra 的数据模型 2、Cassandra 的写操作 3、Cassandra 的读操作 &#xff08…

Mysql 增删改查(一) —— 查询(条件查询where、分页limits、排序order by、分组 group by)

查询 select 可以认为是四个基本操作中使用最为频繁的操作&#xff0c;然而数据量比较大的时候&#xff0c;我们不可能查询所有内容&#xff0c;我们一般会搭配其他语句进行查询&#xff1a; 假如要查询某一个字段的内容&#xff0c;可以使用 where假如要查询前几条记录&#…

线上服务质量的问题该如何去处理?你有什么思路?

线上服务质量的问题该如何去处理&#xff1f;你有什么思路&#xff1f; 目录&#xff1a;导读 发现线上故障 处理线上故障 修复线上故障 运营线上质量 就是前几天有个同学问了我一个问题&#xff1a;目前业内高可用部署主要采用方案&#xff1f; 看到这个问题&#xff0c…

5G网络架构与组网部署

文章目录5G网络架构与组网部署一、5G网络架构的演进趋势5G移动通信系统4G移动通信系统二、核心网架构的演进三、无线接入网的演进趋势5G网络架构与组网部署 一、5G网络架构的演进趋势 5G移动通信系统 5G移动通信系统包括5GC(5G Corn Network,5G核心网)和NG-RAN(Next Generat…

Zookeeper下载安装与集群搭建

Zookeeper下载安装与集群搭建1.下载安装1.1 下载安装1.2 配置启动2.集群搭建2.1 搭建要求2.2 准备工作2.3 配置集群2.4 启动集群2.5 模拟集群异常1.下载安装 1.1 下载安装 1、环境准备 ZooKeeper服务器是用Java创建的&#xff0c;它运行在JVM之上。需要安装JDK 7或更高版本。…

跟我一起写Makefile--个人总结

此篇笔记是根据陈皓大佬《跟我一起写Makefile》学习所得 文章目录换行符clean变量make的自动推导另类风格的Makefile清空目标文件的规则cleanMakefile总述显示规则隐晦规则变量的定义注释引用其它的Makefile环境变量MAKEFILESmake的工作方式书写规则规则举例规则的语法在规则中…

Flutter Windows端打包并生成可安装文件流程

Windows打包 1.首先安装visual Studio 下载地址&#xff1a;https://visualstudio.microsoft.com/zh-hans/ 下载成功后按照下图勾选桌面应用和移动应用下的使用C的桌面开发&#xff0c;勾选右侧安装详细信息中的windows 11/10 sdk 中的任意一个完成安装即可 2.打包Windows …

IC封装常见形式

参考&#xff1a;https://blog.csdn.net/dhs888888/article/details/127673300?utm_mediumdistribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-0-127673300-blog-115610343.pc_relevant_multi_platform_whitelistv4&spm1001.2101.3001.4242…

truffle 创建测试合约并部署到测试网络

1、npm 安装truffle npm install -g truffle2、创建truffle项目 mkdir imooc-on-blockchain-truffle && cd imooc-on-blockchain-truffle3、初始化truffle目录&#xff0c;会生成如下几个目录 contracts 存放.sol合约文件migrations 部署脚本目录test 测试文件目录t…

20230210组会论文总结

目录 【Ultra-High-Definition Low-Light Image Enhancement: A Benchmark and Transformer-Based Method】 【ShuffleMixer: An Efficient ConvNet for Image Super-Resolution】 【A Close Look at Spatial Modeling: From Attention to Convolution 】 【DEA-Net: Single i…

自动机,即有限状态机

文章目录一、问题来源二、题目描述三、题解中的自动机四、自动机学习五、有限状态机的使用场景一、问题来源 今天做力克题目的时候看到了字符串转换整数的一道算法题&#xff0c;其中又看到了题解中有自动机的概念&#xff0c;所以在这里对自动机做个笔记。题目链接 二、题目描…

详解Python正则表达式中group与groups的用法

在Python中&#xff0c;正则表达式的group和groups方法是非常有用的函数&#xff0c;用于处理匹配结果的分组信息。 group方法是re.MatchObject类中的一个函数&#xff0c;用于返回匹配对象的整个匹配结果或特定的分组匹配结果。而groups方法同样是re.MatchObject类中的函数&am…

MySQL主从同步-(一)搭建主机服务器

准备工作&#xff1a;搭建mysql 数据库 主从复同步系统 centos 7.5 运行环境 docker mysql版本 8.0.3 准备主机服务器第一步&#xff1a;停止虚拟机中其他 docker &#xff0c;关闭防火墙&#xff0c;关闭系统的mysql&#xff08;防止端口冲突&#xff09;docker stop $(docker…

C++11实现计算机网络中的TCP/IP连接(Windows端)

目录引言1、TCP2、IP2.1 IP路由器3、TCP/IP4、TCP/IP协议C11实现参考文献引言 TCP/IP 指传输控制协议/网际协议&#xff08;Transmission Control Protocol / Internet Protocol&#xff09;。[1] 在TCP/IP协议簇中主要包含以下内容&#xff1a; TCP (传输控制协议) - 应用程序…

Bing引擎引入ChatGPT申请候补名单方式

Bing引入ChatGPT申请候补名单方式ChatGPT一、ChatGPT简介二、OpenAI和Google的"军备军赛"三、ChatGPT版本⭐Bing引擎引入ChatGPT申请候补名单方式1.下载chrome拓展程序2.配置拓展程序3.Bing 申请候补名单3.1旧版本Bing3.2新版本Bing4.等待获取结尾ChatGPT 一、ChatG…