+ -
当前位置:首页 → 问答吧 → 考考大家一道某著名IT的面试题

考考大家一道某著名IT的面试题

时间:2010-08-18

来源:互联网

类似于背包,但又不同。

有6种木块,数量无穷,大小分别12,-12,+7,-7,+5,-5,给任一正值空间W,从这六种木块中任意选择填充空间,直到正好填满,求使用木块数量最少的一种填充方法。

比如:W=19,这时有很多种填充方法,比如{12, 7},{7,7,5}等等,,但第一种使用木块最少

当时给了我15分钟,,悲剧了

作者: chong232   发布时间: 2010-08-18

本帖最后由 davelv 于 2010-08-18 10:02 编辑

写程序么?
我的思路是,6个备用模块,取组合,然后相加,得到64--!种数值,然后把和值作为key, 把对应模块重量作为value从小到大,顺序保存到一个表中,然后用二分法查表即可。

作者: davelv   发布时间: 2010-08-18

回复 davelv


    这个组合,你怎么取,这才是关键的

作者: chong232   发布时间: 2010-08-18

本帖最后由 davelv 于 2010-08-18 10:02 编辑

我手上有现成的组合函数,STD里面也应该有。从C(0,6)取到C(6,6)全部组合就可以了,一共64 --!种取法。

作者: davelv   发布时间: 2010-08-18

回复 davelv

   你可以测试一下,我觉得不行啊
  另外,C(6, 0) -- C(6,6)才64,不知道你72怎么来的

作者: chong232   发布时间: 2010-08-18

额,总数我算错了,是64个。为什么不行阿,算法上完全没问题。

作者: davelv   发布时间: 2010-08-18

W=1怎么填

作者: slay78   发布时间: 2010-08-18

回复 davelv


    好好想想,这个问题挺复杂的

作者: chong232   发布时间: 2010-08-18

本帖最后由 davelv 于 2010-08-18 10:21 编辑

请告诉我,我的算法有什么问题吗?
我明白了,数量无穷。。

作者: davelv   发布时间: 2010-08-18

负数的块不可能太多,加入负数的块等于在原先的W之上加入所有负数块总和的相反数,换句话说假设你限定的这个负数块最大的阈值是S,那么问题就是求从W到W+S之间的最优值的最小值
比如说你W为17,然后阈值定义为12,那么就是求17到29之间最优值的最小值了
至于阈值定多少,肯定不会很大,对于所有的情况估计值不会超过24,有待具体分析,我只是大概给个范围
最后就是这个问题的最主要问题了,给定正数块12,7,5怎么用最小数目的块构造一个T(W到W+S之间的数),这个用动态规划就可以实现了,假设对于T最小块数是best[T],那么best = min(best[T - 5], best[T - 7], best[T - 12]),对于无法获得的就设置为无穷大,初始值是best[0] = 0,然后结果就是min(best[i])(W<=i<=W+S)。
同时有一个推论,就是当W很大的时候,并不需要从1算到W,而是貌似只要计算到一个特定值,其它的部分用12(最大的块)填满(以前看到过,不知道有没有记错),这样时间就更快了。
空间上由于对于每个块,我们需要的数值跨越幅度只有12,那么我们只要维护长比12和S的值大一点的数组就行了,然后滚动向前,个人建议取2的幂,比如64这样的,因为循环滚动的时候下标不用%64,只要&63就可以了。
以上个人观点,只是一个大体思路,难免有不对之处,见谅

作者: daybreakcx   发布时间: 2010-08-18

想到一个方法,先求得w=[1,12]的最佳取法。
当w>12时,每次递减12直至剩余的空间在[1,12]的范围内,然后再从表中获取对应取法。

作者: davelv   发布时间: 2010-08-18



QUOTE:
想到一个方法,先求得w=[1,12]的最佳取法。
当w>12时,每次递减12直至剩余的空间在[1,12]的范围内,然后再 ...
davelv 发表于 2010-08-18 10:25



贪心是无法总得到最优解的,比如我给你个14
按照你的方法,你先减去最大的,也就是减去12,剩下2,然后构造2最快的是用两个,就是7和-5,总共用了3个
实际上我两个7就搞定了。

作者: daybreakcx   发布时间: 2010-08-18

回复 daybreakcx


    当时我回答的也是贪心,不过先判断是否是12,7,5的倍数,再判断是否可以最大可能的填充,即依次尝试填充12,7,5,最后只剩下W=1,2,3,4这四种情况了,可以穷举找出

   但我保证不了是最优,面试官不置可否,,悲剧

作者: chong232   发布时间: 2010-08-18

回复 chong232


    考官不置可否是经常的事情,这个问题还算比较经典的动态规划,贪心可以局部进行时间和空间的增强,但是要想获得最优解贪心不行

作者: daybreakcx   发布时间: 2010-08-18

总觉得应该有个值M,当W>M时,最优(W%M)+W/M*最优(M) ==最优(W)

作者: davelv   发布时间: 2010-08-18