leetcode: 638.大礼包
题目描述:
https://leetcode-cn.com/problems/shopping-offers/
解题思路:
这类求最大最小的问题首先想到的就是用DP求解。
这题还用到了递归,首先计算单买商品,不购买大礼包的价格最为初始最小价值。
再利用循环计算包含每一个大礼包时的最小价值。需要递归计算的是,在购买了礼包A以后,剩余的需求量的最小价格。
其中需要注意的是不能超过需求量购买商品,所以对于每个礼包需要做一次判断,是否购买了该礼包后,超过了总需求。
代码:
class Solution { public: bool check(vector<int>bag, vector<int> needs) { for(int i=0; i<needs.size(); i++) { if(needs[i]<bag[i]) { return false; } } return true; } int shoppingOffers(vector<int>& price, vector<vector<int>>& special, vector<int>& needs) { int min_price=0; for(int i=0; i<price.size(); i++) { min_price += price[i]*needs[i]; } int j; for(int i=0; i<special.size(); i++) { vector<int> remain = needs; if(check(special[i], remain)) { for(j=0; j<remain.size(); j++) { remain[j] = remain[j] - special[i][j]; } int cur_price = special[i][j] + shoppingOffers(price, special, remain); min_price = min(cur_price, min_price); } } return min_price; } };