一、题目

二、思路

backtracking 回溯法

思路:先求出不用大礼包的价格,因为最坏情况,一个offer 不用也就这样了。

在此基础上尝试使用每个大礼包,一旦发现有合法的大礼包尝试使用,然后看看是不是总价格更低了,是的话就采用。因为不同的大礼包有好有坏,所有用完当前大礼包还要撤销一下,即回溯一下,这样才能继续尝试其他大礼包,本质上还是枚举了所有的可能性。取一个最小值。判断是否合法大礼包的逻辑也很简单。必须每个物品的量都不能超过needs的量。因为不能多买。

算法步骤

  • 1.先求出不用大礼包的价格money
  • 2.两层for循环对每个大礼包进行遍历,看看每个大礼包是否满足数量小于需求这个条件
  • 3.如果满足条件,将needs需求减少;
  • 4.递归调用,
    -money=min(money,special[i][special[i].size()-1]+shoppingOffers(price,special,needs));
    当前money和递归调用(假设用了当前大礼包,下一次再从第一个大礼包开始用,返回的是用了第一个大礼包后数量减少的money+当前大礼包的钱)后的money取小值
  • 5.回溯,将needs变回原样,进行下一个大礼包试探,取最小值

三、代码

class Solution {public:int shoppingOffers(vector<int>& price, vector<vector<int>>& special, vector<int>& needs) {if(needs.empty()){return 0;}//先求出不用大礼包时的金钱int money=0;for(int i=0;i<needs.size();++i){money+=needs[i]*price[i];}//当使用大礼包时for(int i=0;i<special.size();++i){//判断大礼包的数量是否小于所需的数量int pos=0;for(int j=0;j<special[i].size()-1;++j){if(special[i][j]>needs[j]){pos=1;break;}}//当满足时,改变总价,更改needs数量if(pos==0){for(int j=0;j<special[i].size()-1;++j){//减去这些数量的钱//money-=special[i][j]*price[j];//减去需求needsneeds[j]-=special[i][j];}//加上大礼包的价格//money+=special[i][special[i].size()-1];//现在的大礼包价格+减去大礼包数量的返回价格money=min(money,special[i][special[i].size()-1]+shoppingOffers(price,special,needs));//将需求回归for(int j=0;j<special[i].size()-1;++j){//加上需求needsneeds[j]+=special[i][j];}}}return money;}
};

LeetCode-638. 大礼包相关推荐

  1. leetcode - 638. 大礼包

    638. 大礼包 --------------------------------------- 在LeetCode商店中, 有许多在售的物品.然而,也有一些大礼包,每个大礼包以优惠的价格捆绑销售一组 ...

  2. Java实现 LeetCode 638 大礼包(阅读理解题,DFS)

    638. 大礼包 在LeetCode商店中, 有许多在售的物品. 然而,也有一些大礼包,每个大礼包以优惠的价格捆绑销售一组物品. 现给定每个物品的价格,每个大礼包包含物品的清单,以及待购物品清单.请输 ...

  3. LeetCode 638. 大礼包(无限背包DP)

    1. 题目 在LeetCode商店中, 有许多在售的物品. 然而,也有一些大礼包,每个大礼包以优惠的价格捆绑销售一组物品. 现给定每个物品的价格,每个大礼包包含物品的清单,以及待购物品清单.请输出确切 ...

  4. 力扣638. 大礼包(回溯法+剪枝优化)

    第八十八天 --- 力扣638. 大礼包 题目一 思路:回溯法 代码 无剪枝的回溯 剪枝优化 Sum Up 题目一 力扣:力扣638. 大礼包 思路:回溯法 1.我们先不考虑礼包,直接去买东西,就是物 ...

  5. leetcode刷题 638大礼包

    在 LeetCode 商店中, 有 n 件在售的物品.每件物品都有对应的价格.然而,也有一些大礼包,每个大礼包以优惠的价格捆绑销售一组物品. 给你一个整数数组 price 表示物品价格,其中 pric ...

  6. leetcode 638. Shopping Offers | 638. 大礼包(动态规划,多约束背包问题)

    题目 https://leetcode.com/problems/shopping-offers/ 题解 类似题目有:leetcode 474. Ones and Zeroes | 474. 一和零( ...

  7. 【力扣638】 大礼包问题 JAVA全过程详解,绝对易懂

    [前言]:本文讲解[力扣638 大礼包]的[动态规划]方法及其[记忆化搜索]的改进. 一.题目描述 在 LeetCode 商店中,有 n 件在售的物品.每件物品 i 都有对应的价格,也有一些大礼包以优 ...

  8. C#LeetCode刷题-动态规划

    动态规划篇 # 题名 刷题 通过率 难度 5 最长回文子串 22.4% 中等 10 正则表达式匹配 18.8% 困难 32 最长有效括号 23.3% 困难 44 通配符匹配 17.7% 困难 53 最 ...

  9. leetcode算法练习 JavaScript实现

    leetcode 表格内容由spider.js从leetcode-cn.com爬取. 已做题目答案也从leetcode-cn.com中爬取并生成文件. 解题进度:已解决 140/637 - 简单 94 ...

  10. LeetCode中的那些题

    目录 1. 两数之和 2. 两数相加 3. 无重复字符的最长子串 *******4.寻找两个有序数组的中位数(官方解答) : 5.最长回文子串(官方解答) 15. 三数之和 16. 最接近的三数之和 ...

最新文章

  1. selenium + python自动化测试环境搭建
  2. CloudFlare免费CDN优化指南
  3. python入门教程收藏_python入门教程:超详细保你1小时学会Python,快来收藏看看...
  4. java远程监控服务器配置_JAVA VirtualVM远程监控配置
  5. 敏捷冲刺每日报告一(Java-Team)
  6. spring注入普通java类_普通java类如何取得注入spring Ioc容器的对象
  7. (数据库系统概论|王珊)第三章关系数据库标准语言SQL-第四节:数据查询
  8. python netifaces模块 获取本机IP,网关等信息
  9. 电脑突然无法播放html音频,电脑无法播放音频怎么办
  10. android 3d侧拉抽屉,iOS动画指南 - 4.右拉的3D抽屉效果
  11. 3.3Packet Tracer - 实施基本连接
  12. 计算机专业自主招生有哪些学校,2019自主招生学校有哪些 自主招生考试院校名单...
  13. 'grunt' 不是内部或外部命令,也不是可运行的程序 或批处理文件
  14. IOS UTI(统一类型标识符) 根据文件后缀打开APP
  15. ikbc机械键盘打字出现重复_再也不怕半夜打字影响家人了——ikbc c104机械键盘评测...
  16. UDT 最新源码分析(三) -- UDT Socket 相关函数
  17. 【电脑使用】美化你的Windows
  18. 微信微网站的服务器ip地址查询,微信开发之(三)获取微信服务器IP地址
  19. R语言非参数检验多重比较
  20. TKO 2-5 贪心算法之稳定排序2 基本素质2093

热门文章

  1. MUV LUV UNLIMITED(ccpc 秦皇岛2019)
  2. gitlab安装和基础管理
  3. MySql 索引的最左匹配原则举例详解
  4. 小满nestjs(第十九章 nestjs 管道验证DTO)
  5. 使用 trt 的int8 量化和推断 onnx 模型
  6. 秒杀抢购系统架构分析与实战
  7. 课堂练习及课后作业2.3:系统调用
  8. UI_XMLJSON
  9. 安装linux系统initrd,修改initrd,创建一个微型的linux系统
  10. 7×14小时陪伴,DaDaBaby核心课程升级背后到底有多少考量?