问题描述
木头排列的问题:一堆长短不一的木头需要装在纸盒子里面,每一层由若干个木头组成,且木头拼接的总长度不能超过盒子的长度1200mm。使整体形成一个L型的形状。写一个算法实现功能。看你们的算法能力了,这道题是一家大型企业的面试题。具体哪一家稍后会公布,看看你们的能力了。
解决方案
解决方案二:
1200mm是不是多余了?
解决方案三:
好难啊。好难啊。
解决方案四:
使整体形成L是什么意思?
解决方案五:
最大层数有限制吧,如果不限制的话,直接排序,然后一层只放一根木头,大的在下,小的在上。。
解决方案六:
表示关注,
解决方案七:
好麻烦!题目的意思是不是将若干根木头拼接,取得小于1200mm的最大值,接着再在剩下的木头中取出若干根,又使其组合为“最大值”.....依次类推。
解决方案八:
按长短排序放进链表里,每次取出几个小于1200的最大值
解决方案九:
按L是要从上到下每层的长度越来越长
解决方案十:
题目的意思表示不是很理解
解决方案十一:
怎么没有后续了。。。
解决方案十二:
写个哈夫曼树然后从根节点开始往下找(左右子树),直到节点值小于1200,把所有这样的节点值从小到大排,然后根据树叶构成,搭木块,不知道这样是不是可以呢。
解决方案十三:
引用4楼bylijinnan的回复:
最大层数有限制吧,如果不限制的话,直接排序,然后一层只放一根木头,大的在下,小的在上。。
这种题最大层数肯定没有限制,但是肯定是要求最少层数了。引用6楼yujinlong0001的回复:
好麻烦!题目的意思是不是将若干根木头拼接,取得小于1200mm的最大值,接着再在剩下的木头中取出若干根,又使其组合为“最大值”.....依次类推。
这题目如果不考虑效率倒是不难,按照6楼的这种思路翻译成代码就完了,如果要考虑效率恐怕还真是不好搞。6楼的这种方式效率肯定很低。
解决方案十四:
如果要确保层数最小,是很难的题目,如果差不多就行,就算一般难的题目
解决方案十五:
解决方案:
引用3楼vnvlyp的回复:
使整体形成L是什么意思?
应该是把长的放成一层层短的放竖着求最优算法
解决方案:
引用12楼rumlee的回复:
Quote: 引用4楼bylijinnan的回复:
最大层数有限制吧,如果不限制的话,直接排序,然后一层只放一根木头,大的在下,小的在上。。这种题最大层数肯定没有限制,但是肯定是要求最少层数了。引用6楼yujinlong0001的回复:
好麻烦!题目的意思是不是将若干根木头拼接,取得小于1200mm的最大值,接着再在剩下的木头中取出若干根,又使其组合为“最大值”.....依次类推。这题目如果不考虑效率倒是不难,按照6楼的这种思路翻译成代码就完了,如果要考虑效率恐怕还真是不好搞。6楼的这种方式效率肯定很低。
应该是把长的放成一层层短的竖着放求最优算法
解决方案:
确实如Android_iPhone所说,如果要确保层数,确实很难,不要确保的话还行。个人思路,可能有误,仅供参考:设计两个类搞定木头类,是个Bean属性:长度(不对外暴露SET方法,在初始化对象的时候随机生成)木头的ID盒子类属性:弄一个字段1200用来限制长度一个静态的TreeMap,K是层长度,V是一个List里面放了这层的木头方法:静态putWood接受一个参数,List<Wood>list,返回一个盒子对象主要功能是循环执行,随机放入1到list.size()根木头,因为是TreeMap,所以随便放,放进去后会按照K来排序。主类:main方法,搞一个LIST放几个木头对象,用盒子类的静态方法putWood返回一个盒子对象,盒子对象都拿到了,接下来把它的TreeMap拿出来,再把每层和每层的LIst中的木头拿出来,打印出来看看完事儿。
解决方案:
没看懂题,这要是在面试时不是要pass的节奏吗
解决方案:
最偷懒的办法,全部用贪婪法,把这些木头分成若干组,使得每组的总长都<=1200,然后将这些组按照总长度排序,长的排底下。当然不是最优解,但是应该性价比比较高吧。
解决方案:
我猜应该这样做:每次从剩余的木棍中选择几根,1。长度和不超过1200mm的。2.并且长度和是最大的。这样的选择过程其实就是一个0-1背包问题吧。