[LeetCode] Shopping Offers 购物优惠

LeetCode商店有多种商品,每种商品都有固定价格。提供了一些特殊优惠,每个优惠包含不同商品组合及对应折扣价。任务是找出购买指定数量商品的最低总价,充分利用优惠。输入包括商品价格、优惠组合、需求商品数量。示例显示了如何计算最优购买方案的总价。问题要求使用递归找到最低价格,且优惠券可无限次使用,但不能购买超过需求的商品数量。
摘要由CSDN通过智能技术生成

#题目
In LeetCode Store, there are some kinds of items to sell. Each item has a price.

However, there are some special offers, and a special offer consists of one or more different kinds of items with a sale price.

You are given the each item’s price, a set of special offers, and the number we need to buy for each item. The job is to output the lowest price you have to pay for exactly certain items as given, where you could make optimal use of the special offers.

Each special offer is represented in the form of an array, the last number represents the price you need to pay for this special offer, other numbers represents how many specific items you could get if you buy this offer.

You could use any of special offers as many times as you want.

  • Example 1:
    Input: [2,5], [[3,0,5],[1,2,10]], [3,2]
    Output: 14
    Explanation:
    There are two kinds of items, A and B. Their prices are 2 and 5 respectively.
    In special offer 1, you can pay 5 for 3A and 0B
    In special offer 2, you can pay 10 for 1A and 2B.
    You need to buy 3A and 2B, so you may pay $10 for 1A and 2B (special offer #2), and 4 for 2A.

  • Example 2:
    Input: [2,3,4], [[1,1,0,4],[2,2,1,9]], [1,2,1]
    Output: 11
    Explanation:
    The price of A is 2, and 3 for B, 4 for C.
    You may pay 4 for 1A and 1B, and 9 for 2A ,2B and 1C.
    You need to buy 1A ,2B and 1C, so you may pay 4 for 1A and 1B (special offer #1), and 3 for 1B, 4 for 1C.
    You cannot add more items, though only $9 for 2A ,2B and 1C.

  • Note:
    There are at most 6 kinds of items, 100 special offers.
    For each item, you need to buy at most 6 of them.
    You are not allowed to buy more items than you want, even if that would lower the overall price.

分析题目

  • 本题说有一些商品,各自有不同的价格,然后给我们了一些优惠券,可以在优惠的价格买各种商品若干个,要求我们每个商品要买特定的个数,问我们使用优惠券能少花多少钱,注意优惠券可以重复使用,而且商品不能多买。
  • 我们可以先求出不使用任何商品需要花的钱数作为结果res的初始值,然后我们遍历每一个优惠券,定义一个变量isValid表示当前优惠券可以使用,然后遍历每一个商品,如果某个商品需要的个数小于优惠券中提供的个数,说明当前优惠券不可用,isValid标记为false。如果遍历完了发现isValid还为true的话,表明该优惠券可用,我们可以更新结果res,对剩余的needs调用递归并且加
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值