1.6 饮料供货

题意:有若干种饮料,给出每种饮料的ID、单位容量(为2的方幂)、总数量和满意度。给定总容量限额,求最大满意度的购买方法。

看了解法一的讨论,本人直接想到的就是记忆化的DFS,但是解法一给出的是动态规划的解法,计算所有子状态,反推出解。这种解法的缺点很明显,有些状态可能根本不可能到达,浪费了资源,另外笔者个人觉得此法看起来不如DFS直观,还要做边界预处理。

解法二是一种常用的搜索方法,在搜索的同时记录已经计算过的状态还能提高效率,代码也是直观明了。

实际上本题目应该是为解法三设计的,我们在解这个问题的时候没有注意到饮料单位容量为2的方幂,利用这个条件,贪心的方法就足够了。但是,笔者还是喜欢用记忆化DFS,因为贪心法的代码写起来并不见得简单。

记忆化DFS和动态规划在处理饮料的时候都是按饮料种类一个一个来,处理完一种的所有情况继续下一种,而这里贪心法则是按照容量展开的,需要相当一部分管理代码。

这种差异是因为,一个种类的饮料具有相同的容量和满意度,属性统一,而一种容量却可能有多种种类,属性就繁杂化了。

在程序设计中,最好是把有共性的元素放在一起,因为在逻辑上,它们是一个类别的,是可以线性化排列的;将具有不同属性的元素放在一起,则可能需要对属性分类,人为增加了处理维度。

posted on 2012-10-18 17:35  罗辑  阅读(170)  评论(0编辑  收藏  举报