-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path638.shopping-offers.cpp
108 lines (108 loc) · 3.2 KB
/
638.shopping-offers.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
/*
* @lc app=leetcode id=638 lang=cpp
*
* [638] Shopping Offers
*
* https://leetcode.com/problems/shopping-offers/description/
*
* algorithms
* Medium (49.24%)
* Total Accepted: 22.5K
* Total Submissions: 45.7K
* Testcase Example: '[2,5]\n[[3,0,5],[1,2,10]]\n[3,2]'
*
*
* 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.
*
*
*/
void operator-=(vector<int> &a, const vector<int> &b) {
for (int i = 0; i < a.size(); i++)
a[i] -= b[i];
}
int operator*(const vector<int>& price, const vector<int>& needs){
int cost = 0;
for(int i=0; i<(int)needs.size(); i++)
cost += needs[i]*price[i];
return cost;
}
bool operator<(const vector<int>& lneeds, const vector<int>& needs){
for(int j=0; j<(int)lneeds.size(); j++){
if(lneeds[j] < needs[j]){
return true;
}
}
return false;
}
class Solution {
public:
int mincost(vector<int>& price, vector<vector<int>>& special, vector<int> needs){
int cost = price*needs;
for(int i=0; i<special.size(); i++){
if(special[i].back() > cost || needs < special[i]) continue;
vector<int> lneeds = needs;
lneeds -= special[i];
cost = min(cost, special[i].back()+mincost(price, special, lneeds));
}
return cost;
}
int shoppingOffers(vector<int>& price, vector<vector<int>>& special, vector<int>& needs) {
return mincost(price, special, needs);
}
};