[Swift]LeetCode638. 大礼包 | Shopping Offers

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(shanqingyongzhi)
➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址: http://www.javashuo.com/article/p-njidlwmw-me.html 
➤若是连接不是山青咏芝的博客园地址,则多是爬取做者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持做者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★html

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

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

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.this

Example 1:spa

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:code

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:orm

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

在LeetCode商店中, 有许多在售的物品。htm

然而,也有一些大礼包,每一个大礼包以优惠的价格捆绑销售一组物品。

现给定每一个物品的价格,每一个大礼包包含物品的清单,以及待购物品清单。请输出确切完成待购清单的最低花费。

每一个大礼包的由一个数组中的一组数据描述,最后一个数字表明大礼包的价格,其余数字分别表示内含的其余种类物品的数量。

任意大礼包可无限次购买。

示例 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和2B,也能够用¥9购买2A,2B和1C。
你须要买1A,2B和1C,因此你付了¥4买了1A和1B(大礼包1),以及¥3购买1B, ¥4购买1C。
你不能够购买超出待购清单的物品,尽管购买大礼包2更加便宜。

说明:

  1. 最多6种物品, 100种大礼包。
  2. 每种物品,你最多只须要购买6个。
  3. 你不能够购买超出待购清单的物品,即便更便宜。

Runtime: 76 ms
Memory Usage: 18.9 MB
 1 class Solution {
 2     func shoppingOffers(_ price: [Int], _ special: [[Int]], _ needs: [Int]) -> Int {
 3         var needs = needs
 4         var res:Int = 0
 5         var n:Int = price.count
 6         for i in 0..<n
 7         {
 8             res += price[i] * needs[i]
 9         }
10         for offer in special        
11         {
12             var isValid:Bool = true
13             for j in 0..<n
14             {
15                 if needs[j] - offer[j] < 0
16                 {
17                     isValid = false                    
18                 }
19                 needs[j] -= offer[j]
20             }
21             if isValid
22             {
23                 res = min(res, shoppingOffers(price, special, needs) + offer.last!)
24             }
25             for j in 0..<n
26             {
27                 needs[j] += offer[j]
28             }
29         }
30         return res
31     }
32 }
相关文章
相关标签/搜索