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;
    }
};
原文地址:https://www.cnblogs.com/LJ-LJ/p/10657067.html