Leetcode: Dynamic Programming之Shopping offers

Leetcode: Dynamic Programming之Shopping offers_第1张图片

这道题跟Knapsack 问题非常相似, 但是难度上有很大的升级。 首先, 这个不是课本上的例子,我们得自己做出了。

还有一个问题,在knapsack里, 物品的只有一种版本的套餐。 这里有普通零售价格以及套餐价格。 Also, knapsack只要管背包上限的条件,但是这题你已知每个产品你要购买的数量,也就是你同时有好多种限制条件。如果你分开处理, 买2个A, 3个B比如说。 你2个A是这个offer买的, 3个B另一个offer买的。这种单独处理没考虑到万一有那么一种套餐直接把2A  3B全包了还特别便宜。

上面基本是我看到这道题时候的内心戏。 然后如何寻找子问题?如果是复杂的情况怎么办。 比如说买10个东西, A有3个现在,B有3个现在。 有好多种不同的搭配方式阿。。。想到这个时候就有点蛋疼了。。难道是DP+DFS?

Leetcode: Dynamic Programming之Shopping offers_第2张图片
Leetcode: Dynamic Programming之Shopping offers_第3张图片

看完官方答案后跪拜。。。。

答案拿什么当做subproblem? 拿套餐的范围作为subproblem。

也就是最基本的版本,1. 没有特别套餐的话, 只能单价买产品,这种情况的价格就是最初级的subproblem的解。

2. 如果有特别套餐1的话。 这个套餐会不会被使用。

3. 如果有特别套餐2的话, 会不会被使用。


。。。

用的是recursion+DP。 这里的DP 没有用array 之类的,也是非常不按套路

为什么是recursion? 因为最终答案是:没有套餐的情况和  至少有第1个套餐option套餐的情况下的最好情况做比较出来的。  至少有第1个套餐option套餐是由  至少有第1个套餐option套餐  和至少有2个套餐的情况比较出来的。。。 所以要一路算到后面。

你可能感兴趣的:(Leetcode: Dynamic Programming之Shopping offers)