程式語言 - LeetCode - CPP - 638. Shopping Offers



題目:


解答:

class Solution {
public:
    int shoppingOffers(vector<int>& price, vector<vector<int>>& special, vector<int>& needs) {
        map<vector<int>, int> memo;

        auto dfs = [&](this auto&& dfs, vector<int> new_needs) {
            if (memo.count(new_needs)) {
                return memo[new_needs];
            }

            int ans = 0;

            for (int i = 0; i < price.size(); ++i) {
                ans += new_needs[i] * price[i];
            }

            for (auto& offer : special) {
                bool valid = true;
                vector<int> nx = new_needs;

                for (int i = 0; i < needs.size(); ++i) {
                    if (nx[i] < offer[i]) {
                        valid = false;
                        break;
                    }

                    nx[i] -= offer[i];
                }

                if (valid) {
                    ans = min(ans, offer.back() + dfs(nx));
                }
            }

            return memo[new_needs] = ans;
        };

        return dfs(needs);
    }
};