leetcode - 638. 大礼包
638. 大礼包
———————————————————————————————————————
在LeetCode商店中, 有许多在售的物品。然而,也有一些大礼包,每个大礼包以优惠的价格捆绑销售一组物品。
现给定每个物品的价格,每个大礼包包含物品的清单,以及待购物品清单。请输出确切完成待购清单的最低花费。
每个大礼包的由一个数组中的一组数据描述,最后一个数字代表大礼包的价格,其他数字分别表示内含的其他种类物品的数量。任意大礼包可无限次购买。
示例 1:
输入: [2,5], [[3,0,5],[1,2,10]], [3,2]
输出: 14
解释:
有A和B两种物品,价格分别为¥2和¥5。
大礼包1,你可以以¥5的价格购买3A和0B。
大礼包2, 你可以以¥10的价格购买1A和2B。
你需要购买3个A和2个B, 所以你付了¥10购买了1A和2B(大礼包2),以及¥4购买2A。
示例 2:
输入: [2,3,4], [[1,1,0,4],[2,2,1,9]], [1,2,1]
输出: 11
解释:
A,B,C的价格分别为¥2,¥3,¥4.
你可以用¥4购买1A和1B,也可以用¥9购买2A,2B和1C。
你需要买1A,2B和1C,所以你付了¥4买了1A和1B(大礼包1),以及¥3购买1B, ¥4购买1C。
你不可以购买超出待购清单的物品,尽管购买大礼包2更加便宜。
说明:
最多6种物品, 100种大礼包。
每种物品,你最多只需要购买6个。
你不可以购买超出待购清单的物品,即使更便宜。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shopping-offers
———————————————————————————————————————
解题思路:
使用递归的思路,对于大礼包集合中的每一个礼包,计算needs中去掉该礼包后的最小花费和购买当前礼包所需的花费的总合,然后和不购买礼包的价格相比较,选择较小的价格。具体的C++代码如下:
class Solution
{
public:bool valid(vector<int> &special_single, vector<int> &needs) //该函数的功能是判断大礼包中某一个物品的数量是否超过所需的物品的数量, 如果超过了所需的数量,则抛弃该礼包。{for(int i=0;i<needs.size();i++){if(special_single[i]>needs[i]) return false;}return true;}int shoppingOffers(vector<int> &price, vector<vector<int>> &special, vector<int> &needs) {int min_money = 0; //该变量用于存储所需花费的最小值for(int i=0;i<needs.size();i++) //该循环用于计算不购买礼包的花费{min_money += price[i] * needs[i];}for(int i=0;i<special.size();i++) //遍历大礼包集合中的每个礼包{if(valid(special[i],needs)) //如果该礼包符合条件,则进入if中进行运算{vector<int> new_needs(needs.size(),0); //new_needs用于存储购买了该礼包后剩余需要购买的物品的数量for(int j=0;j<needs.size();j++) //新的needs = 旧的needs - 礼包中物品的个数new_needs[j] = needs[j] - special[i][j]; int money_tmp = shoppingOffers(price,special,new_needs) + special[i][needs.size()];min_money = min(min_money,money_tmp); //最后求出最低价格}}return min_money;//返回最低价格}};
leetcode - 638. 大礼包相关推荐
- 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. 最接近的三数之和 ...
最新文章
- 链表问题7——判断一个链表是否为回文结构(进阶)
- linux命令行ps1变量_Linux下SHELL的PS1变量简介
- Github 2020 年度报告:你以为新冠击溃了开发者?不!他们创造了更多代码...
- 解决mac osx下pip安装ipython权限的问题
- 从零开始学前端:浮动 --- 今天你学习了吗?(CSS:Day15)
- 梦想cad控件 android,梦想CAD控件 2018.7.26更新
- 挑战程序设计竞赛: 三角形
- 图像匹配所用方法总结
- Python xlwt 操作 excel 表格基础(一):单元格写入、合并、插入位图等
- 群晖 DLNA 设置
- 汇总 | 嵌入式软硬件领域各种“黑科技”
- gitbook踩坑指南-无法转pdf、epub等;pdf调字体大小
- 仓储机器人的3位鼻祖
- 中学教师资格证——综合素质备考心得+建议
- 微软project下载安装及激活教程
- C51单片机-2只LED灯循环闪烁
- CAFFE源码学习之优化方法solver
- 数码相机摄影修复技术DxO PureRAW中文
- APP热更新方案(转)
- 机器学习 使用三分法找最优解参数