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

力扣题解(大礼包)

638. 大礼包

已解答

中等

相关标签

相关企业

在 LeetCode 商店中, 有 n 件在售的物品。每件物品都有对应的价格。然而,也有一些大礼包,每个大礼包以优惠的价格捆绑销售一组物品。

给你一个整数数组 price 表示物品价格,其中 price[i] 是第 i 件物品的价格。另有一个整数数组 needs 表示购物清单,其中 needs[i] 是需要购买第 i 件物品的数量。

还有一个数组 special 表示大礼包,special[i] 的长度为 n + 1 ,其中 special[i][j] 表示第 i 个大礼包中内含第 j 件物品的数量,且 special[i][n] (也就是数组中的最后一个整数)为第 i 个大礼包的价格。

返回 确切 满足购物清单所需花费的最低价格,你可以充分利用大礼包的优惠活动。你不能购买超出购物清单指定数量的物品,即使那样会降低整体价格。任意大礼包可无限次购买。

思路:

本题可以发现物品数目极少,最多只有6种,且每种物品需要的数量不超过10种,即所有可能是11的6次方,因此遍历所有情况不会超过10的7次方的范围,不会超时。

具体遍历方式:对于当前的需求curneed,先考虑全部用单买的方式得出一个价格,然后对所有礼包进行遍历,如果当前礼包买完以后,剩下需要的物品数目不会有负数,那么表示当前买这个礼包是合法的(因为本题要求精确的买每一个需要的物品,数量不能超过所需要的数量),那就用同样的方式,找到去掉这个礼包之后的需求的最大值money,用money加上礼包的价格,和当前需求的最小花费比较,得出更小的当前最小花费,最后返回题目要求的nee的的最小花费就是结果。

优化:本题中有些礼包可能会不划算,即买礼包比单买同样数目的物品所需要的价值还要高,那这个礼包一定是不需要的。另外有些礼包可能没有任何物品,或者礼包里的物品数目本来就超过了所需要的数目,那这些礼包一定是不用考虑的,可以直接舍弃。

另外可以用记忆化搜索的方式保存当前curneed的最小花费,减少重复运算的次数。

时间复杂度分析:

假设礼包是M个,物品是n个,每个物品需要的数目不超过N。

对于礼包优化,所需要的时间是n*m,对于函数,一共有最多N的n次方种情况,每种情况需要n的时间去遍历单买,M*n的时间去遍历礼包,因此极限情况下是M*n*N的n次方,空间复杂度是N的n次方存状态和递归,M存优化后的礼包,是N的n次方+M的空间。


http://www.kler.cn/a/377797.html

相关文章:

  • 如何在一个 Docker 容器中运行多个进程 ?
  • QML —— QML调用C++两种方法(附完整测试源码)
  • Node.js——fs模块-同步与异步
  • QT5串口多线程--派生类加moveToThread
  • Unity中实现伤害飘字或者提示飘字效果(DoTween实现版本)
  • ffmpeg:视频字幕嵌入(GPU加速)
  • yarn 下载安装、下载依赖、通过 vscode 运行服务(Windows11)
  • 对于自带缓存的对象的注意点
  • 8. 数据结构——邻接表、邻接矩阵的基本操作
  • Elasticsearch Search Template 搜索模板
  • 代码随想录算法训练营第十五天| 654.最大二叉树 、617.合并二叉树 、700.二叉搜索树中的搜索、98.验证二叉搜索树
  • AcWing 320 能量项链 状态压缩dp
  • 【C++刷题】力扣-#566-重塑矩阵
  • 前端八股文第四篇
  • WorkFlow源码剖析——Communicator之TCPServer(上)
  • Linux:编辑器Vim和Makefile
  • ResTful风格的Url
  • Mac如何实现高效且干净的卸载应用程序
  • Gateway解说
  • 目标追踪DeepSort
  • network HCIE认证
  • 一文带你深入理解Rust 中的 Trait 一致性(Coherence)
  • SparkSQL整合Hive后,如何启动hiveserver2服务
  • Spring Boot框架下的水电管理系统开发
  • leetcode-21-合并两个有序链表
  • mac电脑设置crontab定时任务,以及遇到的问题解决办法