经典记忆化搜索
class Solution {
public:
map<vector<int>, int> memo;
vector<vector<int>> special;
vector<int> price;
int n;
int dfs(vector<int> need) {
if (memo.count(need)) return memo[need];
int minprice = 0;
for (int i = 0; i < n; i++) {
minprice += price[i] * need[i];
}
for (auto &sp : special) {
vector<int> nextneed;
for (int i = 0; i < n; i++) {
if (sp[i] > need[i]) break;
nextneed.emplace_back(need[i] - sp[i]);
}
if (nextneed.size() == n) {
minprice = min(minprice, dfs(nextneed) + sp[n]);
}
}
return memo[need] = minprice;
}
int shoppingOffers(vector<int>& price, vector<vector<int>>& special, vector<int>& needs) {
n = price.size();
this->price = price;
for (auto &sp : special) {
int cnt = 0, p = 0;
for (int i = 0; i < n; i++) {
cnt += sp[i];
p += sp[i] * price[i];
}
if (cnt > 0 and p > sp[n]) this->special.emplace_back(sp);
}
return dfs(needs);
}
};