总的思路就是记忆化搜索+动态规划,对于每个礼包我选择买或不买一个,如果买了就更新需求列表,递归的对新需求进行每个礼包的选择。
我们还可以对礼包进行预处理,排除掉不合适或者无意义的礼包,减少计算量。
注意点:本题如果用贪心的思想考虑会出问题,如例:
[6,3]
[[3,2,9],[1,2,1],[0,1,5],[2,5,9]]
[6,6]
因为按照贪心思想,当前礼包合适我们就尽可能的多买当前礼包,然后继续考虑其他,但是这样不能得到最优解,即无法证明贪心法的正确性。
编程实现参考自官方题解
class Solution
{
public:
map<vector<int>, int> memo; //用来存放不同需求列表所需最低价格
int shoppingOffers(vector<int> &price, vector<vector<int>> &special, vector<int> &needs)
{
int n = price.size();