当前位置: 首页 > news >正文

每周一算法:双向深搜

题目描述

达达帮翰翰给女生送礼物,翰翰一共准备了 N N N 个礼物,其中第 i i i 个礼物的重量是 G [ i ] G[i] G[i]

达达的力气很大,他一次可以搬动重量之和不超过 W W W的任意多个物品。

达达希望一次搬掉尽量重的一些物品,请你告诉达达在他的力气范围内一次性能搬动的最大重量是多少。

输入格式

第一行两个整数,分别代表 W W W N N N
以后 N N N行,每行一个正整数表示 G [ i ] G[i] G[i]

输出格式

仅一个整数,表示达达在他的力气范围内一次性能搬动的最大重量。

数据范围

1 ≤ N ≤ 46 1≤N≤46 1N46,
1 ≤ W , G [ i ] ≤ 2 31 − 1 1≤W,G[i]≤2^{31}−1 1W,G[i]2311

输入样例

20 5
7
5
4
18
1

输出样例

19

算法思想

根据题目描述,需要从给定的 N N N个数中选择几个,使它们的和最接近 W W W,属于“子集和”问题的扩展;当然也可以从背包问题的角度去思考解决,但是这里背包的“体积”过大( 1 ≤ W ≤ 2 31 − 1 1≤W≤2^{31}−1 1W2311),时间和空间复杂度都不允许。

这类问题的直接解法就是进行“指数型”枚举,搜索每个礼物选还是不选,时间复杂度为 O ( 2 N ) O(2^N) O(2N)。此题 N ≤ 46 N≤46 N46 2 46 2^{46} 246的复杂度过高,可以利用双向深搜的思想进行优化。

双向深搜

除了迭代加深之外,双向深搜也可以避免在深层子树上浪费时间。

在一些题目中,问题不但具有“初态”,还具有明确的“终态”,并且从初态开始搜索与从终态开始逆向搜索产生的搜索树都能覆盖整个状态空间。在这种情况下,就可以采用双向搜索——从初态和状态出发各搜索一半,产生的两棵深度减半的搜索树,在中间交汇、组成最终答案。避免了层数过深时,分支数量的大规模增长。

下图是直接进行一次搜索产生的搜索树:
在这里插入图片描述
下图是双向搜索的两棵搜索树,避免了避免了层数过深时,分支数量的大规模增长。
在这里插入图片描述

算法实现

将礼物分成两部分

  • 首先,从前一半礼物中枚举出所有组合,将可能达到 0 ∼ W 0\sim W 0W之间的所有重量值,存放在一个数组 a [ ] a[] a[]中,并对数组进行排序、去重
  • 然后,进行第二次搜索,尝试从后一半礼物中枚举出所有组合,对于每个可能达到的重量 k k k,在第一部分得到的数组 a [ ] a[] a[]中查找 k + a [ i ] ≤ W k+a[i]\le W k+a[i]W的最大值,可以使用二分查找。

这样,算法的时间复杂度为 O ( 2 N 2 × l o g N 2 ) O(2^{\frac{N}{2}}\times log\frac{N}{2}) O(22N×log2N)

代码实现

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
const int N = 50;
int w[N];
int cnt, a[1 << 25]; //存储前一半礼物所有组合的重量
int n, W, ans;
void dfs1(int i, int k) //k表示目前组合的重量
{if(i == n / 2) //只搜索前一半的礼品{a[cnt ++] = k; //将组合得到的重量存到a数组return;}if((LL)k + w[i] <= W) dfs1(i + 1, k + w[i]); //装得下第i件礼物dfs1(i + 1, k); //不装第i件礼物
}
void dfs2(int i, int k)
{if(i == n) //搜索完成,二分查找不超过W的最大组合重量{int L = 0, R = cnt - 1;while(L < R){int mid = (L + R + 1) / 2;if((LL)k + a[mid] <= W) L = mid;else R = mid - 1;}ans = max(ans, k + a[L]);return;}if((LL)k + w[i] <= W) dfs2(i + 1, k + w[i]); //装得下第i件礼物dfs2(i + 1, k); //不装第i件礼物
}
int main()
{cin >> W >> n;for(int i = 0; i < n; i ++) cin >> w[i];//优化搜索顺序,优先搜索重量较大的礼品sort(w, w + n);reverse(w, w + n);dfs1(0, 0); //枚举前一半礼品的组合,将其组合得到的重量存到a数组sort(a, a + cnt); //对前一半礼物组合得到的重量排序去重cnt = unique(a, a + cnt) - a;//对后一半礼物进行搜索dfs2(n / 2, 0);cout << ans;return 0;
}

相关文章:

每周一算法:双向深搜

题目描述 达达帮翰翰给女生送礼物&#xff0c;翰翰一共准备了 N N N 个礼物&#xff0c;其中第 i i i 个礼物的重量是 G [ i ] G[i] G[i]。 达达的力气很大&#xff0c;他一次可以搬动重量之和不超过 W W W的任意多个物品。 达达希望一次搬掉尽量重的一些物品&#xff0c;请…...

蓝桥杯刷题(十)

1.翻转 代码 输入数据&#xff0c;每组数据进行比较&#xff0c;j的范围掐头去尾&#xff0c;若a[j]b[j]&#xff0c;继续&#xff0c;若出现010,101子串则改成000,111&#xff0c;遍历完后比较a是否等于b&#xff0c;相同则输出次数&#xff0c;不同则输出-1。 for _ in ran…...

ioDraw:与 GitHub、gitee、gitlab、OneDrive 无缝对接,绘图文件永不丢失!

&#x1f31f; 绘图神器 ioDraw 重磅更新&#xff0c;文件保存再无忧&#xff01;&#x1f389; 无需注册&#xff0c;即刻畅绘&#xff01;✨ ioDraw 让你告别繁琐注册&#xff0c;尽情挥洒灵感&#xff01; 新增文件在线实时保存功能&#xff0c;支持将绘图文件保存到 GitHu…...

利用 Python 处理遥感影像数据:计算年度平均影像

在地球科学、气象学以及环境监测等领域&#xff0c;遥感影像数据是一种重要的信息源&#xff0c;它们可以提供地表的地形、植被覆盖、气候变化等丰富信息。然而&#xff0c;随着观测技术的进步&#xff0c;我们通常会获得大量的遥感影像数据&#xff0c;如何高效地处理和分析这…...

【Leetcode-73.矩阵置零】

题目&#xff1a; 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]]示例 2&…...

redis 常见的异常

目录 一、缓存穿透 1、概念 解决方案 &#xff08;1&#xff09;布隆过滤器 (2)、缓存空对象 二、缓存雪崩 1、概念 解决方案 &#xff08;1&#xff09;redis高可用 &#xff08;2&#xff09;限流降级 &#xff08;3&#xff09;数据预热 一、缓存穿透 1、概念 缓…...

npm包、全局数据共享、分包

使用 npm 包 小程序对 npm 的支持与限制 目前&#xff0c;小程序中已经支持使用 npm 安装第三方包&#xff0c;从而来提高小程序的开发效率。但是&#xff0c;在小程序中使用npm 包有如下 3 个限制&#xff1a; ① 不支持依赖于 Node.js 内置库的包 ② 不支持依赖于浏览器内置…...

UnityShader:IBL

效果&#xff1a; 实现&#xff1a; Shader "MyShader/IBL" {Properties{_CubeMap ("环境贴图", Cube) "white" {}_Exposure("曝光",float)1.0_Color("颜色",color)(1,1,1,1)_NormalMap("法线贴图",2d)"bu…...

每日五道java面试题之mybatis篇(三)

目录&#xff1a; 第一题. MyBatis的框架架构设计是怎么样的?第二题. 为什么需要预编译?第三题. Mybatis都有哪些Executor执行器&#xff1f;它们之间的区别是什么&#xff1f;第四题. Mybatis中如何指定使用哪一种Executor执行器&#xff1f;第五题. Mybatis是否支持延迟加载…...

C#开发五子棋游戏:从新手到高手的编程之旅

C#开发五子棋游戏&#xff1a;从新手到高手的编程之旅 目录 一、引言 二、项目规划与设计思路 三、棋盘与棋子的数据模型构建 四、交互式用户界面设计 五、核心游戏逻辑实现 一、引言 五子棋&#xff0c;作为一种古老的策略型棋类游戏&#xff0c;在全球拥有广泛的爱好者…...

ELK日志管理实现的3种常见方法

ELK日志管理实现的3种常见方法 1. 日志收集方法 1.1 使用DaemonSet方式日志收集 通过将node节点的/var/log/pods目录挂载给以DaemonSet方式部署的logstash来读取容器日志,并将日志吐给kafka并分布写入Zookeeper数据库.再使用logstash将Zookeeper中的数据写入ES,并通过kibana…...

深度强化学习01

Random variable Probability Density Function 期望 Random Sampling 学习视频 这绝对是我看过最好的深度强化学习&#xff01;从入门到实战&#xff0c;7小时内干货不断&#xff01;_哔哩哔哩_bilibili...

C++ 智能指针的使用

智能指针类型 在C程序中&#xff0c;普通变量使用栈内存&#xff0c;为函数运行时专用&#xff0c;结束后会自动释放&#xff0c;无须考虑内存释放问题。 但堆内存是共用的&#xff0c;其使用是通过指针变量的new来分配&#xff0c;使用delete来释放&#xff0c;因指针使用方便…...

Flutter 核心原理 - UI 框架(UI Framework)

Flutter 既能保证很高的开发效率&#xff0c;又能获得很好的性能。 这两年 Flutter 技术热度持续提高&#xff0c;整个 Flutter 生态和社区也发生了翻天覆地的变化。目前Flutter 稳定版发布到了3.0&#xff0c;现在已经支持移动端、Web端和PC端&#xff0c;通过Flutter 开发的…...

Hive优化

工作中涉及到优化部分不多&#xff0c;下面的一些方案可能会缺少实际项目支撑&#xff0c;这里主要是为了完备一下知识体系。 参考的hive参数管理文档地址&#xff1a;https://cwiki.apache.org/confluence/display/Hive/ConfigurationProperties 对于Hive优化&#xff0c;可以…...

React 的 diff 算法

React 的 diff 算法的演进。 在 React 16 之前&#xff0c;React 使用的是称为 Reconciliation 的 diff 算法。Reconciliation 算法通过递归地比较新旧虚拟 DOM 树的每个节点&#xff0c;找出节点的差异&#xff0c;并将这些差异应用到实际的 DOM 上。整个过程是递归的&#x…...

综合知识篇07-软件架构设计考点(2024年软考高级系统架构设计师冲刺知识点总结系列文章)

专栏系列文章: 2024高级系统架构设计师备考资料(高频考点&真题&经验)https://blog.csdn.net/seeker1994/category_12593400.html案例分析篇00-【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】(2024年软考高级系统架构设计师冲刺知识点总结-案例…...

【GPT-SOVITS-05】SOVITS 模块-残差量化解析

说明&#xff1a;该系列文章从本人知乎账号迁入&#xff0c;主要原因是知乎图片附件过于模糊。 知乎专栏地址&#xff1a; 语音生成专栏 系列文章地址&#xff1a; 【GPT-SOVITS-01】源码梳理 【GPT-SOVITS-02】GPT模块解析 【GPT-SOVITS-03】SOVITS 模块-生成模型解析 【G…...

Flutter第四弹:Flutter图形渲染性能

目标&#xff1a; 1&#xff09;Flutter图形渲染性能能够媲美原生&#xff1f; 2&#xff09;Flutter性能优于React Native? 一、Flutter图形渲染原理 1.1 Flutter图形渲染原理 Flutter直接调用Skia。 Flutter不使用WebView&#xff0c;也不使用操作系统的原生控件,而是…...

[氮化镓]GaN中质子反冲离子的LET和射程特性

这篇文件是一篇关于氮化镓&#xff08;GaN&#xff09;中质子反冲离子的线性能量转移&#xff08;LET&#xff09;和射程特性的研究论文&#xff0c;发表在《IEEE Transactions on Nuclear Science》2021年5月的期刊上。论文的主要内容包括&#xff1a; 研究背景&#xff1a;氮…...

Flutter表单验证完全指南

Flutter表单验证完全指南 引言 表单验证是Web和移动应用中不可或缺的一部分&#xff0c;它确保用户输入的数据符合预期格式。本文将深入探讨Flutter中的表单验证技术和最佳实践。 一、表单验证基础 1.1 使用TextFormField TextFormField(decoration: const InputDecoration(lab…...

量子机器学习实战:从QSVM到QNN的构建、优化与避坑指南

1. 量子机器学习实战&#xff1a;从理论到落地的核心挑战量子机器学习&#xff08;QML&#xff09;听起来像是科幻小说里的概念&#xff0c;但作为一名在量子计算和机器学习交叉领域摸爬滚打了多年的从业者&#xff0c;我可以负责任地说&#xff0c;它已经从一个纯粹的学术构想…...

Driver Store Explorer完全指南:Windows驱动管理的终极解决方案

Driver Store Explorer完全指南&#xff1a;Windows驱动管理的终极解决方案 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer Driver Store Explorer&#xff08;简称RAPR&#xff09;是一…...

Python安装文档

下载安装包 访问官方网站:https://www.python.org/ 注意:本人开发使用的事3.13.x。 查看自己的系统 安装 进入安装界面,记得勾选最后一项:"Add python.exe to PATH",然后选择自定义安装 "Customize installation"。 然后进入特性选择页面,什么都…...

基于Transformer的行星大气辐射传输仿真器:百倍加速与1%精度

1. 项目概述&#xff1a;用Transformer重塑行星大气辐射传输计算在行星科学和天体物理领域&#xff0c;模拟一颗行星的大气层如何吸收、散射和发射星光与热辐射&#xff0c;是理解其气候、演化乃至潜在宜居性的基石。这个过程的核心&#xff0c;就是辐射传输计算。无论是预测即…...

MAPED技术:电子衍射材料表征的创新方法

1. MAPED技术概述&#xff1a;电子衍射领域的革新方法多角度进动电子衍射&#xff08;Multi-angle Precession Electron Diffraction, MAPED&#xff09;是近年来在材料表征领域兴起的一项创新技术。这项技术通过采集不同入射角度的4D-STEM扫描数据&#xff0c;并在后期处理中进…...

Atomic Layout测试策略:单元测试与集成测试最佳实践

Atomic Layout测试策略&#xff1a;单元测试与集成测试最佳实践 【免费下载链接】atomic-layout Build declarative, responsive layouts in React using CSS Grid. 项目地址: https://gitcode.com/gh_mirrors/at/atomic-layout 在现代前端开发中&#xff0c;构建可靠的…...

AI by Hand Excel:在电子表格中实现损失函数与精度评估的完整指南

AI by Hand Excel&#xff1a;在电子表格中实现损失函数与精度评估的完整指南 【免费下载链接】ai-by-hand-excel 项目地址: https://gitcode.com/gh_mirrors/ai/ai-by-hand-excel 你是否想过&#xff0c;无需编写一行代码就能深入理解人工智能算法的核心原理&#xff…...

麒麟服务器等保三级配置实战:从SSH双因子到kysec策略落地

1. 这不是“打补丁”&#xff0c;而是给服务器穿防弹衣&#xff1a;麒麟等保配置的真实定位很多人第一次接触“国产麒麟服务器等保配置”&#xff0c;第一反应是&#xff1a;“不就是改几个密码、关几个端口、装个杀毒软件&#xff1f;”——这种理解&#xff0c;轻则导致测评反…...

告别虚拟机!在WSL2上搞定Mujoco物理引擎(保姆级避坑指南)

在WSL2中高效部署Mujoco物理引擎的完整实践指南当机器人学和强化学习开发者需要在Windows环境下进行高效开发时&#xff0c;WSL2已成为替代传统虚拟机和双系统方案的理想选择。然而&#xff0c;在WSL2中配置Mujoco物理引擎时&#xff0c;图形界面显示、依赖库安装和许可证配置等…...