【Acwing171】送礼物(双向dfs)题解

news2024/11/20 7:14:49

本题思路来源于acwing算法提高课

题目描述

 看本文需要准备的知识

1.二分(强烈推荐文章:http://t.csdnimg.cn/Mx9Lr)

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;
}

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

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

相关文章

机器学习算法——线性回归与非线性回归

目录 1. 梯度下降法1.1 一元线性回归1.2 多元线性回归1.3 标准方程法1.4 梯度下降法与标准方程法的优缺点 2. 相关系数与决定系数 1. 梯度下降法 1.1 一元线性回归 定义一元线性方程 y ω x b y\omega xb yωxb 则误差&#xff08;残差&#xff09;平方和 C ( ω , b ) …

【LeetCode】每日一题 2023_11_11 情侣牵手(并查集/贪心)

文章目录 刷题前唠嗑题目&#xff1a;情侣牵手题目描述代码与解题思路偷看大佬题解 结语 刷题前唠嗑 LeetCode? 启动&#xff01;&#xff01;&#xff01; 好好好&#xff0c;这么玩是吧&#xff0c;双十一出道情侣牵手 题目&#xff1a;情侣牵手 题目链接&#xff1a;765…

[LeetCode]-225. 用队列实现栈-232. 用栈实现队列

目录 225. 用队列实现栈 题目 思路 代码 232. 用栈实现队列 题目 思路 代码 225. 用队列实现栈 225. 用队列实现栈 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/implement-stack-using-queues/description/ 题目 请你仅使用两个队列实现一个后…

基于SSM的电子病历系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

ubuntu上如何移植thttpd

thttpd的特点 thttpd 是一个简单、小巧、便携、快速且安全的 HTTP 服务器。 简单&#xff1a; 它只处理实现 HTTP/1.1 所需的最低限度。好吧&#xff0c;也许比最低限度多一点。 小&#xff1a; 请参阅比较图表。它还具有非常小的运行时大小&#xff0c;因为它不会分叉并且非…

Auto-Encoder学习笔记

写在前面 本篇博客是本人在学习李宏毅老师的《机器学习》课程中的Auto-Encoder时&#xff0c;记录的相关笔记&#xff0c;由于只记录了我认为相对重要的部分&#xff0c;所以可能有未记录的部分。博客中的图片来自于教学视频中的截图&#xff0c;视频资源地址为&#xff1a;传…

火山引擎公共云·城市分享会:共享云经验,一起向未来

数智化时代的来临&#xff0c;不仅激发了行业对云计算的资源需求&#xff0c;也重构了云计算的技术架构及产品布局&#xff0c;给业务场景带来更多可能性&#xff0c;让云计算成为企业走向高效治理的一剂“良方”。随着业务的多样化、复杂化&#xff0c;企业应该如何借助云计算…

省钱攻略:三大运营商保号套餐办理攻略,不再当冤大头!

现在的朋友都是相当的聪明&#xff0c;都不想直接在营业厅办理套餐&#xff0c;而是选择保号套餐流量卡。 今天&#xff0c;小编主要介绍的就是三大运营商的保号套餐&#xff0c;以及如何办理&#xff01; 如图所示&#xff1a; ​  电信最低可改5元套餐&#xff0c;移动、联…

软件之禅(七)面向对象(Object Oriented)

黄国强 2023/11/11 前文提到面向对象构建的模块控制器&#xff0c;根据第一性原理&#xff0c;从图灵机的角度&#xff0c;面向对象不是最基本的元素。那么面向对象是不是不重要呢&#xff1f; 答案是否定的&#xff0c;面向对象非常非常重要。当我们面对一个具体的领域…

【CASS精品教程】cass3d基于DOM和DEM生成倾斜三维模型

和EPS一样&#xff0c;cass3d也可以生成三维模型。本文讲解 cass3d基于pix4d生成的正射影像DOM和DSM生成倾斜三维模型&#xff0c;并进行三维测图。 一、三维倾斜模型打开 打开cass11.0软件&#xff0c;打开三维窗口&#xff0c;点击打开模型&#xff0c;选择基于dom和dsm生成…

Leetcode 剑指 Offer II 052. 递增顺序搜索树

题目难度: 简单 原题链接 今天继续更新 Leetcode 的剑指 Offer&#xff08;专项突击版&#xff09;系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 给你一棵二叉搜索树&#xff0c;请 按中序遍历 将其重新排列为一…

CMakeCache.txt有什么用

2023年11月11日&#xff0c;周六上午 CMakeCache.txt 是由 CMake 自动生成的一个缓存文件&#xff0c;用于记录在配置过程中生成的各种变量和选项的值。 在使用 CMake 构建项目时&#xff0c;CMake 会根据 CMakeLists.txt 文件中的配置和命令&#xff0c;解析项目的源代码并生…

AD教程 (十二)原理图的编译设置和检查

AD教程 &#xff08;十二&#xff09;原理图的编译设置和检查 通过肉眼初步排查&#xff0c;观察一下原理图上有什么错误 工程编译排查错误 选中工程&#xff0c;右键&#xff0c;选择Compile PCB Project对工程进行编译&#xff0c;根据编译报错&#xff0c;定位错误&#…

【服务配置文件详解】补充rsyslog服务的配置文件翻译解读

学习rsyslog日志管理服务的配置文件 # rsyslog configuration file 关于rsyslog软件的配置文件# For more information see /usr/share/doc/rsyslog-*/rsyslog_conf.html 想看到更多相关信息&#xff0c;可以去查看这个文件&#xff0c;rsyslog-*的*表示软件版本&#xff0c;我…

StartUML的基本使用

文章目录 简介和安装创建包创建类视图时序图 简介和安装 最近在学习一个项目的时候用到了StartUML来构造项目的类图和时序图 虽然vs2019有类视图&#xff0c;但是也不是很清晰&#xff0c;并没有生成uml图&#xff0c;但是宇宙最智能的IDE IDEA有生成uml图的功能 下面就简单介…

Windows10+vs2015源码编译subversion

Windows源码安装subversion 一、运行环境 windows10 64位系统 VS2015完整安装 Subversion1.6.3 二、源码编译环境配置 1、python环境安装 python-2.4.msi2、perl环境安装 ActivePerl-5.8.8.822-MSWin32-x86-280952.msi3、openssl编译 C:>cd openssl-0.9.7f C:>p…

1236. 递增三元组

题目&#xff1a; 1236. 递增三元组 - AcWing题库 思路&#xff1a;枚举 1.由给定数据估计时间复杂度。 数据范围为1~1e5---->时间复杂度只能为O(n)或者O(nlogn)。 2.先暴力枚举找到思路&#xff0c;再设法优化。 只枚举中间的数组B。对于枚举的每一个bi&#xff0…

【Java】智慧工地云平台源码支持多端展示(PC端、手机端、平板端)

智慧工地系统实现工地的数字化、精细化、智慧化生产和管理。 一、智慧工地发展趋势 1.更加智能 未来的智慧工地系统将逐步植入人工智能和虚拟现实等高科技技术以更为智慧的方式&#xff0c;来实现岗位人员与工地现场的交互与配合。智慧工地系统能够在工程全生命周期管理的过程…

内网如何使用Python第三方库包(举例JustinScorecardPy)

内网如何使用Python第三方库包 一、下载python whl文件(官网有的) 1、第一种方法 要直接下载whl文件&#xff0c;你可以按照以下步骤操作&#xff1a; 首先&#xff0c;访问 https://pypi.org/ 或 https://www.lfd.uci.edu/~gohlke/pythonlibs/ 网站。这两个都是Python的官方…

golang工程组件——redigo使用(redis协议,基本命令,管道,事务,发布订阅,stream)

redisgo redis 与 client 之间采用请求回应模式&#xff0c;一个请求包对应一个回应包&#xff1b;但是也有例外&#xff0c;pub/sub 模 式下&#xff0c;client 发送 subscribe 命令并收到回应包后&#xff0c;之后被动接收 redis 的发布包&#xff1b;所以若需要使 用 pub/s…