买瓜(dfs+剪枝)

题目描述

小蓝正在一个瓜摊上买瓜。瓜摊上共有 n 个瓜,每个瓜的重量为 Ai 。

小蓝刀功了得,他可以把任何瓜劈成完全等重的两份,不过每个瓜只能劈一刀。

小蓝希望买到的瓜的重量的和恰好为 m 。

请问小蓝至少要劈多少个瓜才能买到重量恰好为 m 的瓜。如果无论怎样小蓝都无法得到总重恰好为 m 的瓜,请输出 −1 。

输入格式

输入的第一行包含两个整数 n, m,用一个空格分隔,分别表示瓜的个数和小蓝想买到的瓜的总重量。

第二行包含 n 个整数 Ai,相邻整数之间使用一个空格分隔,分别表示每个瓜的重量。

输出格式

输出一行包含一个整数表示答案。

样例输入

3 10
1 3 13

样例输出

2

提示

对于 20% 的评测用例,∑n≤10;

对于 60% 的评测用例,∑n≤20;

对于所有评测用例,1 ≤n≤30,1≤ Ai ≤ 10^9 ,1 ≤ m ≤ 10^9

思路:

使用深度优先搜索解决, 对每个瓜的三种选择进行搜索, 解空间树是一颗完全三叉树, 时间复杂度为O(3^n), 肯定会超时, 故需要进行剪枝。

买半个瓜时需要将重量除2,会产生小数,故可以将重量数组都乘2,最大重量也乘2。

搜索时需要记录三个状态,当前层数pos,当前总重量sum,当前劈瓜的次数cnt,以下情况需要剪枝:
1)当前劈瓜次数大于已求得的最小次数,即cnt>ans
2)当前重量之和大于要求的重量,即sum>m

但是这样仍然会超时,还可以将重量数组降序排列,使得更快剪枝。还可以创建一个重量数组的后缀数组suf,这样在搜索时可以利用其剪枝:若当前重量加上剩余的所有瓜重量之和小于要求的重量,剪枝。

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
const int N=33;
double a[N];
double s[N]; 
bool st[N];
int n;
double m;
int cnt=1e9;
//三种状态 整个 一半 不要
//dfs+剪枝 
//参数 当前层数 当前的西瓜的总重量 当前切了多少次 
void dfs(int pos,double sum,int num)
{//当sum==m时 取最小的 返回上一层 if(sum==m){cnt=min(cnt,num);return ;}//剪枝 sum+s[n]-s[pos-1] 是求当前sum加上之后所有的数均不能组成时 剪枝一下 if(sum>m||pos>n||cnt<=num||sum+s[n]-s[pos-1]<m) return ;dfs(pos+1,sum+a[pos],num);//整个要 dfs(pos+1,sum+(a[pos]/2),num+1);//半个 dfs(pos+1,sum,num);//都不要 
}
//从大到小排 尽量减少切一半的次数 
double cmp(double x,double y)
{return x>y;} 
int main()
{cin>>n>>m;for(int i=1;i<=n;i++) {cin>>a[i];}//排序 从大到小排 sort(a+1,a+1+n,cmp);//求前缀和 for(int i=1;i<=n;i++) s[i]=s[i-1]+a[i];dfs(1,0,0);if(cnt==1e9) cout<<"-1"<<endl;else cout<<cnt<<endl; return 0;
}

 

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

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

相关文章

数据结构——二叉树的遍历【前序、中序、后序】

&#x1f49e;&#x1f49e; 前言 hello hello~ &#xff0c;这里是大耳朵土土垚~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#x…

单链表详解(如何实现单链表)

文章目录 前言 一、单链表是什么&#xff1f;二、单链表的实现总结 顺序表的缺点 1.中间/头部的插入删除&#xff0c;时间复杂度为O (N) 2.realloc 扩容&#xff08;特别是异地扩&#xff0c;需要申请新空间&#xff0c;拷贝数据&#xff0c;释放旧空间&#xff09;会有不小的…

多场成像,快速提高机器视觉检测能力--51camera

多阵列CMOS传感器与芯片级涂层二向色滤光片相结合&#xff0c;可在单次扫描中同时捕获明场、暗场和背光图像。 多场成像是一种新的成像技术&#xff0c;它可以在不同的光照条件下同时捕获多幅图像。再加上时间延迟积分(TDI)&#xff0c;这种新兴的成像技术可以克服许多限制的传…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《计及台区资源聚合功率的中低压配电系统低碳优化调度方法》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

java-数据结构—树

目录 树的组成 节点 度 根节点 其他组成部分 二叉树 普通二叉树 二叉查找树 二叉树的遍历 前序遍历 中序遍历 后序遍历 层序遍历 总结 平衡二叉树 平衡二叉树的旋转机制 左旋 右旋 需要旋转的四种情况 左左 左右 右右 右左 总结 红黑树 树的组成 节点…

【图(2)】:图的广度优先遍历和深度优先遍历

目录 图的遍历 一、图的广度优先遍历&#xff08;bfs&#xff09; 二、图的深度优先遍历 图的遍历 给定一个图G和其中任意一个顶点v0&#xff0c;从v0出发&#xff0c;沿着图中各边访问图中的所有顶点&#xff0c;且每个顶点仅被遍历一次。"遍历"即对结点进行某种…

MySQL 8.0 的执行计划(EXPLAIN)

MySQL 8.0 的执行计划&#xff08;也称为“EXPLAIN”计划&#xff09;是数据库优化器为 SQL 查询生成的步骤序列。解读执行计划可以帮助数据库管理员&#xff08;DBA&#xff09;和开发者理解查询如何执行&#xff0c;识别潜在的性能问题&#xff0c;并据此优化查询。 下面是如…

一、实战前的准备

目录 系列文章目录 前言 二、项目搭建 三、模块分配 总结 前言 通用后台管理系统使用vue2&#xff0c;使用vue cli构建工具&#xff0c;同时还会使用到element-ui框架进行页面布局&#xff0c;实现顶部导航菜单与左侧导航联动。下面先从三个方面介绍一下通用后台管理的核心…

C++初阶:模板

目录 一.泛型编程 二.函数模板 2.1.函数模板的概念 2.2.函数模板的格式 2.3.函数模板的原理 2.4.函数模板的实例化 隐式实例化 显示实例化 2.5.模板参数的匹配原则 三.类模板 3.1.类模板的格式 3.2.类模板的实例化 3.3.在类模板外部定义成员函数 四.非类型模板参…

系统设计学习(一)分布式系统

分布式系统 CAP 理论 CAP 理论是分布式系统设计中的一个基本原则&#xff0c;它提供了一个思考和权衡一致性、可用性和分区容错性之间关系的框架。 CAP 理论的三个要素如下&#xff1a; 一致性&#xff08;Consistency&#xff09;&#xff1a;在分布式系统中的多个副本或节…

【保姆级】Protobuf详解及入门指南

目录 Protobuf概述 什么是Protobuf 为什么要使用Protobuf Protobuf实战 环境配置 创建文件 解析/封装数据 附录 AQin.proto 完整代码 Protobuf概述 什么是Protobuf Protobuf&#xff08;Protocol Buffers&#xff09;协议&#x1f609; Protobuf 是一种由 Google 开…

PostgreSQL数组查询是否存在某个值

语法 值 ANY (字段);例子 查询ids中包含id5的数据 select * from student where 5 ANY (ids)mybatis select * from student where #{id} ANY (ids)

CrossOver2024实现Mac/Linux上快速运行Win软件和游戏

作为软件产品专家&#xff0c;我对各类软件都有较为深入的了解&#xff0c;下面介绍CrossOver2024这款软件的功能特点。 CrossOver2024是一款功能强大的类虚拟机软件&#xff0c;它的设计目标是在Mac和Linux系统上实现Windows软件和游戏的快速运行。这款软件不仅具有出色的兼容…

Windows下安装Kafka3

本文讲述Windows(win10)下安装Kafka3的方法。基本流程跟《CentOS下安装Kafka3》一样&#xff0c;也是一样需要先安装Java环境&#xff0c;再部署部署Kafka。 首先在官网 Apache Kafka 下载Kafka二进制压缩包。无论是在CentOS还是在Windows下都是下载该压缩包&#xff0c;里面已…

微信小程序实现上下手势滑动切换

效果图 思路 实现一个微信小程序的复合滚动页面&#xff0c;主要通过Swiper组件实现垂直方向的轮播功能&#xff0c;每个轮播项内部使用Scroll-View组件来展示可垂直滚动的长内容&#xff0c;如图片和文本。 代码 <!-- wxml --> <view class"swiper-container…

【硬件工程师面经整理28_其它】

【硬件工程师面经整理27_其它】-CSDN博客By Along 文章目录 1 怎么画时钟线2 LVTTL和LVCMOS电平的是否可以直接互连&#xff1f;3 IC设计流程半波振子的知识&#xff0c;如何拓展带宽 1 怎么画时钟线 时钟线通常用一条带箭头的直线来表示&#xff0c;箭头指向信号变化的方向。…

Vue 中的 key:列表渲染的秘诀

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

编程笔记 html5cssjs 011 HTML内连框架 个人简历二

编程笔记 html5&css&js 011 HTML内连框架 个人简历二 一、代码二、解释 这段HTML代码定义了一个个人简历的页面布局和样式。页面分为多个部分&#xff0c;包括基本信息、自我评价、工作经历、教育经历、项目经历和期望的职业方向。每个部分都使用了自定义的样式&#x…

Flutter入门学习——Flutter和Dart

因为工作的需要&#xff0c;也为了个人发展&#xff0c;现在的话&#xff0c;转战Flutter跨端开发了&#xff0c;虽然目前的项目只发了android端&#xff0c;但是那天尝试了一下Ios的打包流程&#xff0c;也能运行&#xff0c;只是IOS那边的打包稍微复杂一些。 差不多学习了一…

vue+elementUI用户修改密码的前端验证

用户登录后修改密码&#xff0c;密码需要一定的验证规则。旧密码后端验证是否正确&#xff1b;前端验证新密码的规范性&#xff0c;新密码规范为&#xff1a;6-16位&#xff0c;至少含数字/字母/特殊字符中的两种&#xff1b;确认密码只需要验证与新密码是否一致&#xff1b; 弹…