【Acwing171】送礼物(双向dfs)题解
本题思路来源于acwing算法提高课
题目描述

看本文需要准备的知识
1.二分(强烈推荐文章:一分钟学会二分模板
2.dfs基本思想,了解“剪枝”这个术语
思路分析
首先这道题目看起来就是一个01背包,但是如果直接用01背包去做,时间复杂度为2^31*46一定会超时,如果直接使用爆搜,也一定会超时+爆栈,此时,我们对爆搜进行优化,采用双向dfs去搞定这个题目
整体思路是下面的两步
step one:使用爆搜对前N/2个礼物打表(下面会说这里的打表具体指什么),需要的时间复杂度是2^(N/2)
step two:对剩下的N/2个礼物进行爆搜,对搜索树最后一层的每个结点的“礼物重量和”s使用二分,从前N/2个礼物的打表中找到最大不超过w-s的值(w是能拿的礼物重量的上限),求所有这些值的最大值ans
第一个问题,step one中的打表是什么,比如有三个礼物,重量分别为1,2,3,可以打表的个数为2^3个,分别是0,1,2,3,3,4,5,6,其实就是所有礼物的重量组合,很明显,打表之后会出现重量重复的情况,所以可以通过去重做一个小优化,此处去重是使用头文件<algorithm>中的unique函数,假设打表后的数组为weight,元素总个数为cnt,则可以写(排序之后再用):
cnt=unique(weight,weight+cnt)-weight;
第二个问题,step two中“搜索树最后一层的每个结点的礼物重量和”是什么意思,其实这个跟对前N/2个礼物打表是完全等价的,只不过是对后N/2个礼物进行打表并且这个结果没有记录下来而是当场直接使用了而已,具体的意思可以看代码理解
最后,还可以做一个小优化就是把刚开始的重量数组g[46]从大到小排序,这实际上是优化搜索顺序,减少递归树的分支
完整代码
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=50;
typedef long long LL;
int g[N];
int weight[1<<25],cnt;
int n,w,k;
int ans=0;
void dfs1(int u,int s)
{if(u==k){//cout<<u<<" "<<s<<endl;weight[cnt++]=s;return;}dfs1(u+1,s);if((LL)s+g[u]<=w)dfs1(u+1,s+g[u]);
}
void dfs2(int u,int s)
{if(u==n){int l=-1,r=cnt;while(l+1!=r){int mid=(l+r)/2;if(weight[mid]<=w-s)l=mid;else r=mid;}//cout<<weight[l]+s<<endl;if (weight[l]+(LL)s<=w)ans=max(ans,weight[l]+s);return;}dfs2(u+1,s);if((LL)s+g[u]<=w)dfs2(u+1,s+g[u]);
}
int main()
{cin>>w>>n;for(int i=0;i<n;i++)cin>>g[i];sort(g,g+n);reverse(g,g+n);k=n/2; dfs1(0,0);sort(weight,weight+cnt);// for(int i=0;i<cnt;i++)cout<<weight[i]<<endl;cnt=unique(weight,weight+cnt)-weight;// for(int i=0;i<cnt;i++)cout<<weight[i]<<endl;dfs2(k,0);cout<<ans<<endl;return 0;
}
相关文章:
【Acwing171】送礼物(双向dfs)题解
本题思路来源于acwing算法提高课 题目描述 看本文需要准备的知识 1.二分(强烈推荐文章:一分钟学会二分模板 2.dfs基本思想,了解“剪枝”这个术语 思路分析 首先这道题目看起来就是一个01背包,但是如果直接用01背包去做&…...
机器学习---多分类SVM、支持向量机分类
1. 多分类SVM 1.1 基本思想 Grammer-singer多分类支持向量机的出发点是直接用超平面把样本空间划分成M个区域,其 中每个区域对应一个类别的输入。如下例,用从原点出发的M条射线把平面分成M个区域,下图画 出了M3的情形: 1.2 问题…...
玩转Linux基本指令
> 作者简介:დ旧言~,目前大二,现在学习Java,c,c,Python等 > 座右铭:松树千年终是朽,槿花一日自为荣。 > 目标:牢记Linux的基本指令。 > 毒鸡汤:挫…...
【开源分享】国内可用的免费安卓GPT语音助手 - 可音量键唤起,可联网
写在前面:这是一个我写的开源GPT语音助手,不收钱,只求Star! 简要介绍 这是一个基于ChatGPT的安卓端语音助手,允许用户通过手机音量键从任意界面唤起并直接进行语音交流,用最快捷的方式询问并获取回复 使用效果 一、基…...
什么是安全平行切面
安全平行切面的定义 通过嵌入在端—管—云内部的各层次切点,使得安全管控与业务逻辑解耦,并通过标准化的接口为安全业务提供内视和干预能力的安全基础设施。安全平行切面是一种创新的安全体系思想,是实现“原生安全”的一条可行路径。 为什…...
Git 入门使用 —— 建库、代码上下传、常用命令
目录 一、Git 入门 1.1 Git简介 1.2 Git安装 1.3 创建码云仓库 二、Git 使用 2.1 git初始化操作 2.2 代码上传 2.3 代码下载 2.4 代码更新 2.4.1 仓库管理者 2.4.1 仓库使用者 三、Git 常用命令 一、Git 入门 1.1 Git简介 Git是一个开源的分布式版本控制系统&am…...
HTML5学习系列之简单使用1
HTML5学习系列之简单使用1 前言基础显示学习定义网页标题定义网页元信息定义网页元信息定义文档结构div元素di和classtitlerole注释 总结 前言 下班加班期间的简单学习。 基础显示学习 定义网页标题 <html lang"en"> <head> <title>从今天开始努…...
计算机网络第一章(计算机网络开篇)
目录 一.什么是计算机网络1.0 何为计算机网络1.1 什么是Internet?1.2 互联网与互连网1.3 互联网基础结构发展的三个阶段 二.什么是网络协议2.1 协议的三要素2.2 internet协议标准 三. 互联网的组成3.1 边缘部分3.11 端系统之间的通信 3.2 核心部分3.21 数据交换技术 四. 计算机…...
百度秋招突击手册面试算法题:三数之和
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意:答案中不可以包含重复的三元组。 示例 …...
归并排序 图解 递归 + 非递归 + 笔记
前置知识:讲解019-算法笔试中处理输入和输出,讲解020-递归和master公式 (1)左部分排好序,右部分排好序,利用merge过程让左右整体有序(2)merge过程:谁小拷贝谁,直到左右两部分所有的数字耗尽(3)递归实现和非递归实现(4…...
2023 年最好的 Android 系统修复/刷机应用程序和软件
任何 Android 设备要顺利运行,其操作系统必须运行良好。幸运的是,对于大多数 Android 用户来说,这是不间断的。设备运行良好,打电话、共享文档等都没有问题。尽管如此,Android 操作系统可能会停止运行。这可能是由于特…...
Linux下内网穿透实现云原生观测分析工具的远程访问
📑前言 本文主要是Linux下内网穿透实现云原生观测分析工具的远程访问设置的文章,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是青衿🥇 ☁️博客首页:CSDN主页放风讲故事 &…...
卡数据兼容性要求-M2M架构
EUM 应在生产 eUICC 过程中安装并初始化 ISD-R. eUICC 出厂后, ISD-R 应进入 GlobalPlatform Card Specification [GP CS]第 5.3 节中定义的生命周期状态 "PERSONALIZED". ISD-R 权力授予应遵循[GS RPT]附录 C 中的定义. EUM 应在 eUICC 生产过程中安装并…...
C++入门篇3(类和对象【重点】)
文章目录 C入门篇3(类和对象【重点】)1、面向过程和面向对象2、类的引入3、类的定义4、类的访问限定符及封装4.1、访问限定符4.2、封装 5、类的作用域6、类的实例化(对象)7、类对象模型7.1、类对象的存储方式7.2、结构体ÿ…...
【开源】基于Vue.js的生活废品回收系统的设计和实现
目录 一、摘要1.1 项目介绍1.2 项目详细录屏 二、研究内容三、界面展示3.1 登录注册3.2 资源类型&资源品类模块3.3 回收机构模块3.4 资源求购/出售/交易单模块3.5 客服咨询模块 四、免责说明 一、摘要 1.1 项目介绍 生活废品回收系统是可持续发展的解决方案,旨…...
Mysql配置主从复制-GTID模式
目录 主从复制 主从复制的定义 主从复制的原理 主从复制的优势 主从复制的形式 主从复制的模式 主从复制的类型 GTID模式 GTID的概念 GTID的优势 GTID的原理 GTID的配置 Mysql主服务器 编辑 Mysql从服务器 编辑 主从复制 主从复制的定义 是指把数据从一个…...
Flink之状态管理
Flink状态管理 状态概述状态分类 键控、按键分区状态概述值状态 ValueState列表状态 ListStateMap状态 MapState归约状态 ReducingState聚合状态 Aggregating State 算子状态概述列表状态 ListState联合列表状态 UnionListState广播状态 Broadcast State 状态有效期 (TTL)概述S…...
[Mac软件]Adobe Media Encoder 2024 V24.0.2免激活版
软件说明 使用Media Encoder,您将能够处理和管理多媒体。插入、转码、创建代理版本,并几乎以任何可用的格式输出。在应用程序中以单一方式使用多媒体,包括Premiere Pro、After Effects和Audition。 紧密整合 与Adobe Premiere Pro、After …...
Bytebase 2.11.0 - 支持 OceanBase Oracle 模式
🚀 新功能 支持 OceanBase Oracle 模式。支持设置 MySQL 在线变更参数。新增项目数据库查看者的角色。 🎄 改进 支持在项目中直接选择所有用户并为之添加角色。 调整了项目页面的布局。在 SQL 编辑器中通过悬浮面板展示表和列的详情。 🪦 …...
『CV学习笔记』文本识别算法CRNNSVTR介绍
文本识别算法CRNN&SVTR介绍 文章目录 一. 文本识别1.1. 文本识别方法介绍1.1.1. 规则文本识别1.1.2. 不规则文本识别1.2. CRNN算法原理1.2.1. CRNN基本网络结构1.3. SVTR算法原理二. 参考文献一. 文本识别 文本识别是OCR(Optical Character Recognition)的一个子任务,其…...
【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...
