Shopping Offers

 

1.解析

題目大意,給定每個商品的價值和優惠券(優惠券可以重複使用),求解所購買商品最少花多少錢。

2.分析

我最初看到這道題的時候,求最值,以爲是DP,但在設計的過程中,發現有個問題,就是所取到的值並不是局部的最優解,因爲不單要考慮優惠券,而且還要考慮無法使用優惠券的那部分的錢,所以不是DP。參考@Grandyang博主的思路,發現其實採用深度優先檢索是最簡便的,利用一個臨時變量表示是否當前的優惠券可用,若可用,則繼續搜索,若不可用,恢復之前的狀態,搜索下一個。蠻簡單的,具體實現如下:

class Solution {
public:
    int shoppingOffers(vector<int>& price, vector<vector<int>>& special, vector<int>& needs){
        int res = 0, n = price.size();
        for (int i = 0; i < n; ++i)
            res += price[i] * needs[i];
        for (auto offer : special){ //每次遍歷所有的優惠券,因爲優惠券的使用數量不限
            bool isValid = true;
            for (int i = 0; i < needs.size(); ++i){ //假設當前的優惠券可用
                if (needs[i] < offer[i]) isValid = false; //若檢測到不可用,標記
                needs[i] -= offer[i];
            }
            if (isValid)
                res = min(res, shoppingOffers(price, special, needs) + offer.back());
            for (int i = 0; i < needs.size(); ++i){ //恢復不使用優惠券前的狀態
                needs[i] += offer[i];
            }
        }
        
        return res;
    }
};

[1]https://www.cnblogs.com/grandyang/p/7261663.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章