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

news/2024/12/5 12:19:37/

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.ppmy.cn/news/24455.html

相关文章

LabVIEW NI网络设备在MAX中不显示或未识别

LabVIEW NI网络设备在MAX中不显示或未识别有一个NI设备通过网络连接到主机。发生以下情况之一&#xff1a;尝试在Measurement&#xff06;AutomationExplorer&#xff08;MAX&#xff09;中配置设备。设备未显示在“远程系统”下。NIMAX中未检测到CompactRIO&#xff08;cRIO&a…

Dar语法基础-泛型

泛型 如果查看基本数组类型 List 的 API 文档&#xff0c;您会发现该类型实际上是 List<E>。 <…> 表示法将 List 标记为泛型&#xff08;或参数化&#xff09;类型——具有正式类型参数的类型。 按照惯例&#xff0c;大多数类型变量的名称都是单字母的&#xff0…

七大设计原则之里氏替换原则应用

目录1 里氏替换原则2 里氏替换原则应用1 里氏替换原则 里氏替换原则&#xff08;Liskov Substitution Principle,LSP&#xff09;是指如果对每一个类型为 T1 的对象 o1,都有类型为 T2 的对象 o2,使得以 T1 定义的所有程序 P 在所有的对象 o1 都替换成 o2 时&#xff0c;程序 P…

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…

仿真与测试:通过Signal Builder模块生成输入信号

本文研究通过Signal Builder模块生成输入信号的方法。 文章目录1 生成输入信号2 仿真过程2.1 搭建被测模型2.2 搭建Signal Builder输入模块2.3 配置仿真log及仿真3 总结1 生成输入信号 在汽车的电控软件开发中&#xff0c;经常会在Simulink模型内部进行单元测试。单元测试的本…

Lesson 6.6 多分类评估指标的 macro 和 weighted 过程 Lesson 6.7 GridSearchCV 的进阶使用方法

文章目录一、多分类评估指标的 macro 和 weighted 过程1. 多分类 F1-Score 评估指标2. 多分类 ROC-AUC 评估指标二、借助机器学习流构建全域参数搜索空间三、优化评估指标选取1. 高级评估指标的选用方法2. 同时输入多组评估指标四、优化后建模流程在正式讨论关于网格搜索的进阶…

【mysql数据库】

目录SQL数据库分页聚合函数表跟表之间的关联关系SQL中怎么将行转成列SQL注入将一张表的部分数据更新到另一张表WHERE和HAVING的区别索引索引分类如何创建及保存MySQL的索引&#xff1f;怎么判断要不要加索引&#xff1f;索引设计原理只要创建了索引&#xff0c;就一定会走索引吗…

2023 年腾讯云服务器配置价格表出炉(2核2G/2核4G/4核8G/8核16G、16核32G)

腾讯云轻量应用服务器为轻量级的云服务器&#xff0c;使用门槛低&#xff0c;按套餐形式购买&#xff0c;轻量应用服务器套餐自带的公网带宽较大&#xff0c;4M、6M、7M、10M、14M及20M套餐可选&#xff0c;如果是云服务器CVM这个带宽价格就要贵很多了。 1、轻量应用服务器优惠…