LeetCode-638. 大礼包
一、题目
二、思路
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. 大礼包相关推荐
- leetcode - 638. 大礼包
638. 大礼包 --------------------------------------- 在LeetCode商店中, 有许多在售的物品.然而,也有一些大礼包,每个大礼包以优惠的价格捆绑销售一组 ...
- Java实现 LeetCode 638 大礼包(阅读理解题,DFS)
638. 大礼包 在LeetCode商店中, 有许多在售的物品. 然而,也有一些大礼包,每个大礼包以优惠的价格捆绑销售一组物品. 现给定每个物品的价格,每个大礼包包含物品的清单,以及待购物品清单.请输 ...
- LeetCode 638. 大礼包(无限背包DP)
1. 题目 在LeetCode商店中, 有许多在售的物品. 然而,也有一些大礼包,每个大礼包以优惠的价格捆绑销售一组物品. 现给定每个物品的价格,每个大礼包包含物品的清单,以及待购物品清单.请输出确切 ...
- 力扣638. 大礼包(回溯法+剪枝优化)
第八十八天 --- 力扣638. 大礼包 题目一 思路:回溯法 代码 无剪枝的回溯 剪枝优化 Sum Up 题目一 力扣:力扣638. 大礼包 思路:回溯法 1.我们先不考虑礼包,直接去买东西,就是物 ...
- leetcode刷题 638大礼包
在 LeetCode 商店中, 有 n 件在售的物品.每件物品都有对应的价格.然而,也有一些大礼包,每个大礼包以优惠的价格捆绑销售一组物品. 给你一个整数数组 price 表示物品价格,其中 pric ...
- leetcode 638. Shopping Offers | 638. 大礼包(动态规划,多约束背包问题)
题目 https://leetcode.com/problems/shopping-offers/ 题解 类似题目有:leetcode 474. Ones and Zeroes | 474. 一和零( ...
- 【力扣638】 大礼包问题 JAVA全过程详解,绝对易懂
[前言]:本文讲解[力扣638 大礼包]的[动态规划]方法及其[记忆化搜索]的改进. 一.题目描述 在 LeetCode 商店中,有 n 件在售的物品.每件物品 i 都有对应的价格,也有一些大礼包以优 ...
- C#LeetCode刷题-动态规划
动态规划篇 # 题名 刷题 通过率 难度 5 最长回文子串 22.4% 中等 10 正则表达式匹配 18.8% 困难 32 最长有效括号 23.3% 困难 44 通配符匹配 17.7% 困难 53 最 ...
- leetcode算法练习 JavaScript实现
leetcode 表格内容由spider.js从leetcode-cn.com爬取. 已做题目答案也从leetcode-cn.com中爬取并生成文件. 解题进度:已解决 140/637 - 简单 94 ...
- LeetCode中的那些题
目录 1. 两数之和 2. 两数相加 3. 无重复字符的最长子串 *******4.寻找两个有序数组的中位数(官方解答) : 5.最长回文子串(官方解答) 15. 三数之和 16. 最接近的三数之和 ...
最新文章
- selenium + python自动化测试环境搭建
- CloudFlare免费CDN优化指南
- python入门教程收藏_python入门教程:超详细保你1小时学会Python,快来收藏看看...
- java远程监控服务器配置_JAVA VirtualVM远程监控配置
- 敏捷冲刺每日报告一(Java-Team)
- spring注入普通java类_普通java类如何取得注入spring Ioc容器的对象
- (数据库系统概论|王珊)第三章关系数据库标准语言SQL-第四节:数据查询
- python netifaces模块 获取本机IP,网关等信息
- 电脑突然无法播放html音频,电脑无法播放音频怎么办
- android 3d侧拉抽屉,iOS动画指南 - 4.右拉的3D抽屉效果
- 3.3Packet Tracer - 实施基本连接
- 计算机专业自主招生有哪些学校,2019自主招生学校有哪些 自主招生考试院校名单...
- 'grunt' 不是内部或外部命令,也不是可运行的程序 或批处理文件
- IOS UTI(统一类型标识符) 根据文件后缀打开APP
- ikbc机械键盘打字出现重复_再也不怕半夜打字影响家人了——ikbc c104机械键盘评测...
- UDT 最新源码分析(三) -- UDT Socket 相关函数
- 【电脑使用】美化你的Windows
- 微信微网站的服务器ip地址查询,微信开发之(三)获取微信服务器IP地址
- R语言非参数检验多重比较
- TKO 2-5 贪心算法之稳定排序2 基本素质2093