Description
你需要买
Constraints
Solution
每4个bit可表示一个商品数目的状态(
Code
class Solution {
public:
int shoppingOffers(vector<int>& price, vector<vector<int>>& special, vector<int>& needs) {
int S = 0;
for(int i = 0, j = 0; i < needs.size(); j = ++i<<2) {
S |= needs[i] << j;
}
unordered_map<int, int> dp;
auto DP = [&](auto &&DP, int s) {
if(dp.count(s)) return dp[s];
int best = 0;
for(int i = 0, j = 0; i < price.size(); j = ++i<<2) {
int needi = s >> j & 0b1111;
best += price[i] * needi;
}
for(const auto &sp : special) {
int s2 = 0;
bool overflow = false;
for(int i = 0, j = 0; i < sp.size() - 1; j = ++i<<2) {
int needi = s >> j & 0b1111;
if(sp[i] > needi) {
overflow = true;
break;
}
s2 |= needi-sp[i] << j;
}
if(!overflow) {
best = min(best, sp.back() + DP(DP, s2));
}
}
return dp[s] = best;
};
return DP(DP, S);
}
};