大长方体里放小长方体,最多能放多少个(算法)

时间:2021-06-12 00:22:00
一个大的长方体里面放小长方体。小的长方体不能分,且规格都一样 输出最多能放多少个

36 个解决方案

#1


只能用穷举法判断。

#2


能不能具体点
syy64(太平洋)

#3


怎么没人回复
是不是分数给得不够
不够的话可以再加

#4


各位有什么好的思路没
可以进来讨论讨论

#5


你的问题都不清楚,大长方体多大,小的多大,有要求没有?

#6


这可以任意设定
就是说这个算法必须对所有的值都适用

#7


有好的建议也给分了
谁要是能在20号之前解决了(要给出算法的具体过程),我给他200分

#8


比较难啊!共同学习!

#9


是比较难。可考虑这样的思路:先根据大长方形的体积除小长方形的体积来算出大概最多可以放多少个小长方形,在根据大长方形的长、宽、高与小长方形的长、宽、高的比例关系来确定小长方形在大长方形是如何摆放,实际上是一个排列组合的问题,把各种排列组合进行判断,找出其中剩余体积最小者。

#10


syy64(太平洋)
根据你这个思路,你能不能把算法的具体步骤给出来

#11


你先做做试验,有什么问题可以探讨,我现在手头事情也比较多啊。

#12


d

#13


用递归试试。
具体如下
在大长方体中的小长方体一共有6种摆放方式。分别计算出6种方式各能放多少个。选择最多的那种情况。然后把剩余的空间划分为3个长方体。递归结束的标志就是 无论小长方体怎么放都不能放在大长方体中。
举个例子
大长方体的长宽高分别为 10,20,30
小长方体的长宽高分别为 3,6,8
这里我只计算一种情况(10,20,30 对应3,6,8 并假设这种情况为最好的情况)
这种情况下可以摆放  (10/3)*(20/6)*(30/8)=27
剩下的空间划分为3个长方体的长宽高分别为
第一个长放体:  10- (10/3)*3=1,20,30
第二个长放体:  10-1=9,20- (20/6)*6=2,30
第三个长放体:  10-1=9,20-2=18,30-(30/8)*8=6

#14


可以考虑遗传算法~没有具体代码,只是一种思想,需要根据不同的情况来自己设计。

#15


我们可以先做个假设:长方体的长a,宽b,高c;a>b>c切a1,b1,c1,为大长方体的。a2,b2,c2为小长
放法一a1/a2,b1/b2,c1/c2;
放法二 b1/a2,a1/b2,c1/c2;
放法三a1/c2,b1/b2,c1/a2;
放法四 b1/c2,a1/b2,c1/a2;
四种方法穷举可以得到塞?

#16


而且以上四种方法还要嵌套!当装了一层后剩下的空间又是一个新的长方体!

#17


To:yitianyitian(一天一天)
你这种方法我也想过,这种方法可以遍历所有的摆放情况,但我想不出来怎么输出最大的摆放个数

To:xiaoxiaofei(小小飞)
可以说一下用遗传算法解决这道题的思想吗

To:kiss_me(祥仔)
你说的穷举法是怎样穷举的 "yitianyitian(一天一天)"的方法应该也算是一种穷举法吧 而且应该是有六种摆放方法
"当装了一层后剩下的空间又是一个新的长方体"  按这句话的意思,每一层内只能有一种摆放方法,不然剩下的空间不可能是长方体

#18


你把6个摆放情况都算出来。用MAX函数就可以输出最大的个数

#19


我98年的面试题.....

#20


yitianyitian(一天一天)
我重新看了一下你的第一个贴,发现我以前可能误解了你的意思。按我以前的设想是:先在大长方体的角落处按任意方式放一个小长方体,剩下的空间刚好可以划分成3个长方体。而你的意思应该是先按一种方式往大长方体里面装小长方体,直到这种方式下不能在往大长方体里装小长方体为止,这时再把剩余的空间划分为3个长方体,此时再看其他的方式能不能放下去。但你这样好像不能保证最终得到的结果是最好的结果。

ppass(老毛) 
呵呵,你跟这道题挺有缘的呀。请指教!!!

#21


立体的我没有证明过。
不过平面的我证明过(即大长方形里放小长方形)。
证明过程比较长且有一些比较麻烦的公式符号。所以就不列出来了。

#22


学习

#23


多维的背包...

#24


MARKED,STUDYING

#25


感觉不复杂啊,给出我的程序:  也可能我理解不对。

Public Function Count_Num(ByVal Big_a As Long, ByVal Big_b As Long, ByVal Big_c As Long, ByVal Small_a As Long, ByVal Small_b As Long, ByVal Small_c As Long) As Integer


        Dim Big_lenth As Long              '大矩形的长
        Dim Big_width As Long              '大矩形的宽
        Dim Big_high As Long               '大矩形的高
        Dim Small_lenth As Long            '小矩形的长
        Dim Small_width As Long            '小矩形的宽
        Dim Small_high As Long             '小矩形的高

        Dim i As Integer
        Dim j As Integer
        Dim k As Integer
        Dim test As Integer
        Dim numtemp As Integer
        Dim num As Integer



        Big_lenth = Big_a
        Big_width = Big_b
        Big_high = Big_c

        Small_lenth = Small_a
        Small_width = Small_b
        Small_high = Small_c

        test = 0
        Do While test < 6
            If test = 0 Then
                Small_lenth = Small_a
                Small_width = Small_b
                Small_high = Small_c
            ElseIf test = 1 Then
                Small_lenth = Small_b
                Small_width = Small_c
                Small_high = Small_a
            ElseIf test = 2 Then
                Small_lenth = Small_a
                Small_width = Small_c
                Small_high = Small_b
            ElseIf test = 3 Then
                Small_lenth = Small_b
                Small_width = Small_a
                Small_high = Small_c
            ElseIf test = 4 Then
                Small_lenth = Small_c
                Small_width = Small_a
                Small_high = Small_b
            ElseIf test = 5 Then
                Small_lenth = Small_c
                Small_width = Small_b
                Small_high = Small_a
            End If



            If Big_high / Small_high >= 1 And Big_lenth / Small_lenth >= 1 And Big_width / Small_width >= 1 Then
                i = Fix(Big_lenth / Small_lenth)
                j = Fix(Big_high / Small_high)
                k = Fix(Big_width / Small_width)
                numtemp = i * j * k
            Else
                num = 0
            End If

            If numtemp > num Then
                num = numtemp
            End If

            test = test + 1
        Loop

        Count_Num = num
End Function

我的思想,把小长方型变换形状,例如 (5,4,3) 最多6种组合。一种一种组合往大长方型里的往里塞,塞的最多的即是。

我测试了这个数据:(26, 19, 13)最多能放162个(7, 2, 2)。

#26


那你这样就是说全部的小长方体都按同一种摆放方式塞到大长方体里,这显然不对,比如虽然竖着放已经塞满了但是上面还有一部分空间够躺着放的怎么办?

#27


是190个。
用我的算法。

#28


yitianyitian(一天一天):

假设某次剩下的空间划成3个长方体a、b、c,这不是忽略了有另一个小长方体跨越a、b的情况么?

#29


这个确实比较难。我想了个思路,但是没有进行严谨的证明。
假设一个a,b,c长方体,其可以最多放入的m,n,k小长方体的个数为C( p )个。现在问题的关键是这个p和这个2个长方体有什么关系?
现在我们可以简化这个问题,假如放入的是正方体,那么很明显,放入的个数是常数。
所以我们可以做以下2种猜测
1:可以考虑把这个大长方体,划分为若干个以Max(m,n,k)为边的正方体。
2:可以考虑把几个这样的小长方体逼近成一个正方体。
那么这个p就是能放入这样正方体的个数,如果余下的部分可以用继续试探。这个现在的问题的关键是,能否证明余下的部分是最少的余下部分。

#30


to ZeroGts(白水文方) 
认真看下我的算法和例子你就明白了

#31


学习

#32


chenqiu1024 讲的对阿 我忽视这个问题啦。

#33


yitianyitian(一天一天):

你说2d的你证明过,那么这个数据你怎么做?

大,7*7
小,3*4

你的算法是3个吧,但是能放4个。

#34


我完了。
那个证明是我论文的一部分

#35


我觉得还有一个更好的摆放方法,因为我的数据结构不太好,所以呢,我只给出我的想法。

你的问题我明白一点点,但不知道对不对啊。

就是大的长方体中能放多少个小的长方体,你要求的算法,能应用于别人给你的任何值,是吗?
我举个例吧!
假如别人给你:大的长方体:长为10CM,宽为5CM,高为2CM。
              小的长方体:长为 5CM,宽为3CM, 高为0.7CM。
现在求大的长方体中,最多能放多少个小的长方体?

我的算法思路是这样想的,不能穷举法,不知道行不行,那位师兄可以写代码证实一下。因为我的开发语言还没有到那种程序。
首先,如果我们来摆这个长方体的话,是按大长方体的大小来放小的长方体的位置(如果是横,纵,斜),我想了一下,如果彩斜的话,应该摆不了多少!那最佳的办法应该是彩横或纵的摆放方法,现在就要确定采用横或者纵的方法了。怎么确定呢?因为人家给你了长方体的大小,所以,用大的长方体的体积/小的长方体的体积=能摆放最多小长方体的体积。求出了最大数量,那么来设计算法:
按大的长方体:长为10CM,宽为5CM,高为2CM。
  小的长方体:长为 5CM,宽为3CM, 高为0.7CM。当然,这是最好的,因为长,宽,高,都一一对应。那么,计算机却不知道哪是高,哪是长,哪是宽吧!我们就做一个判断(就同我们不知道那一边是高,那一边是长一样)。
    设大长方体:长=max(5,10,2); 这样,长=10;在余下的两边中选宽=max(5,2),  宽=5;高=2
    设小长方体:长=max(0.7,5,3);这样,长=5; 在余下的两边中选宽=max(0.7,3),宽=3;高=0.7
因为我们已经从上面的判断中,让计算机知道了,大小长方体的长,宽,高,那么,我们就可以让计算机按小的长方体的长的一边,摆在大的长的一边,宽摆在宽的一边,摆在高的一边。这样,就已经得出了按需摆事实放所占地空间,然后我们也得出了按需摆放的数量。然后把这个数量和上面的“大的长方体的体积/小的长方体的体积=能摆放最多小长方体的体积。求出了最大数量”比较,看一看是不是最佳的算法。
先想像成一个二维空间,此刻不是立体的。
来看一看我怎么写的吧!
大的长方体的长除以小的长方体的长,得到有多少个了。和最大的比较,不等,那么不是我们想要的最佳摆法,就存在可能在摆放最后的几个小长方体的数量的过程中,占用了多的空间,我们就按边来设计最后几个立体的摆放算法。怎么设计呢?首先我们要确定,横向摆放到几个的时候,我们要改变摆放的位置。那我们就写程序让计算机拿出一个小的长方体,然后再比较大的长方体余下的空间的长,是不是正好等于或者大于小长方体的长。如果是,那么摆放一个,如果不是,那么已经是这个大的长方体余下的空间已经是横摆的最小空间了,就让计算机做判断,余下空间的长,和小长方体的宽比例是多少,如果余下空间的长:小长方体的宽>余下空间的长:小长方体的长。那么我们采用纵摆。

如果算法完成,仍达不到“用大的长方体的体积/小的长方体的体积=能摆放最多小长方体的体积”的最大数量,那么,此算法失败。

我的意思表达得可能不清楚,因为我学历低的原因。我也会用.net语言写一份出来。传给你。
可能要一个星期左右吧!因为我这几天要设计BBS的数据库。所以不好意思啊。

#36


To:Eilien(漂泊的男人)
即使得出的数大于“用大的长方体的体积/小的长方体的体积=能摆放最多小长方体的体积”,也不能说明这个得出的数是我们所要的最大数

#1


只能用穷举法判断。

#2


能不能具体点
syy64(太平洋)

#3


怎么没人回复
是不是分数给得不够
不够的话可以再加

#4


各位有什么好的思路没
可以进来讨论讨论

#5


你的问题都不清楚,大长方体多大,小的多大,有要求没有?

#6


这可以任意设定
就是说这个算法必须对所有的值都适用

#7


有好的建议也给分了
谁要是能在20号之前解决了(要给出算法的具体过程),我给他200分

#8


比较难啊!共同学习!

#9


是比较难。可考虑这样的思路:先根据大长方形的体积除小长方形的体积来算出大概最多可以放多少个小长方形,在根据大长方形的长、宽、高与小长方形的长、宽、高的比例关系来确定小长方形在大长方形是如何摆放,实际上是一个排列组合的问题,把各种排列组合进行判断,找出其中剩余体积最小者。

#10


syy64(太平洋)
根据你这个思路,你能不能把算法的具体步骤给出来

#11


你先做做试验,有什么问题可以探讨,我现在手头事情也比较多啊。

#12


d

#13


用递归试试。
具体如下
在大长方体中的小长方体一共有6种摆放方式。分别计算出6种方式各能放多少个。选择最多的那种情况。然后把剩余的空间划分为3个长方体。递归结束的标志就是 无论小长方体怎么放都不能放在大长方体中。
举个例子
大长方体的长宽高分别为 10,20,30
小长方体的长宽高分别为 3,6,8
这里我只计算一种情况(10,20,30 对应3,6,8 并假设这种情况为最好的情况)
这种情况下可以摆放  (10/3)*(20/6)*(30/8)=27
剩下的空间划分为3个长方体的长宽高分别为
第一个长放体:  10- (10/3)*3=1,20,30
第二个长放体:  10-1=9,20- (20/6)*6=2,30
第三个长放体:  10-1=9,20-2=18,30-(30/8)*8=6

#14


可以考虑遗传算法~没有具体代码,只是一种思想,需要根据不同的情况来自己设计。

#15


我们可以先做个假设:长方体的长a,宽b,高c;a>b>c切a1,b1,c1,为大长方体的。a2,b2,c2为小长
放法一a1/a2,b1/b2,c1/c2;
放法二 b1/a2,a1/b2,c1/c2;
放法三a1/c2,b1/b2,c1/a2;
放法四 b1/c2,a1/b2,c1/a2;
四种方法穷举可以得到塞?

#16


而且以上四种方法还要嵌套!当装了一层后剩下的空间又是一个新的长方体!

#17


To:yitianyitian(一天一天)
你这种方法我也想过,这种方法可以遍历所有的摆放情况,但我想不出来怎么输出最大的摆放个数

To:xiaoxiaofei(小小飞)
可以说一下用遗传算法解决这道题的思想吗

To:kiss_me(祥仔)
你说的穷举法是怎样穷举的 "yitianyitian(一天一天)"的方法应该也算是一种穷举法吧 而且应该是有六种摆放方法
"当装了一层后剩下的空间又是一个新的长方体"  按这句话的意思,每一层内只能有一种摆放方法,不然剩下的空间不可能是长方体

#18


你把6个摆放情况都算出来。用MAX函数就可以输出最大的个数

#19


我98年的面试题.....

#20


yitianyitian(一天一天)
我重新看了一下你的第一个贴,发现我以前可能误解了你的意思。按我以前的设想是:先在大长方体的角落处按任意方式放一个小长方体,剩下的空间刚好可以划分成3个长方体。而你的意思应该是先按一种方式往大长方体里面装小长方体,直到这种方式下不能在往大长方体里装小长方体为止,这时再把剩余的空间划分为3个长方体,此时再看其他的方式能不能放下去。但你这样好像不能保证最终得到的结果是最好的结果。

ppass(老毛) 
呵呵,你跟这道题挺有缘的呀。请指教!!!

#21


立体的我没有证明过。
不过平面的我证明过(即大长方形里放小长方形)。
证明过程比较长且有一些比较麻烦的公式符号。所以就不列出来了。

#22


学习

#23


多维的背包...

#24


MARKED,STUDYING

#25


感觉不复杂啊,给出我的程序:  也可能我理解不对。

Public Function Count_Num(ByVal Big_a As Long, ByVal Big_b As Long, ByVal Big_c As Long, ByVal Small_a As Long, ByVal Small_b As Long, ByVal Small_c As Long) As Integer


        Dim Big_lenth As Long              '大矩形的长
        Dim Big_width As Long              '大矩形的宽
        Dim Big_high As Long               '大矩形的高
        Dim Small_lenth As Long            '小矩形的长
        Dim Small_width As Long            '小矩形的宽
        Dim Small_high As Long             '小矩形的高

        Dim i As Integer
        Dim j As Integer
        Dim k As Integer
        Dim test As Integer
        Dim numtemp As Integer
        Dim num As Integer



        Big_lenth = Big_a
        Big_width = Big_b
        Big_high = Big_c

        Small_lenth = Small_a
        Small_width = Small_b
        Small_high = Small_c

        test = 0
        Do While test < 6
            If test = 0 Then
                Small_lenth = Small_a
                Small_width = Small_b
                Small_high = Small_c
            ElseIf test = 1 Then
                Small_lenth = Small_b
                Small_width = Small_c
                Small_high = Small_a
            ElseIf test = 2 Then
                Small_lenth = Small_a
                Small_width = Small_c
                Small_high = Small_b
            ElseIf test = 3 Then
                Small_lenth = Small_b
                Small_width = Small_a
                Small_high = Small_c
            ElseIf test = 4 Then
                Small_lenth = Small_c
                Small_width = Small_a
                Small_high = Small_b
            ElseIf test = 5 Then
                Small_lenth = Small_c
                Small_width = Small_b
                Small_high = Small_a
            End If



            If Big_high / Small_high >= 1 And Big_lenth / Small_lenth >= 1 And Big_width / Small_width >= 1 Then
                i = Fix(Big_lenth / Small_lenth)
                j = Fix(Big_high / Small_high)
                k = Fix(Big_width / Small_width)
                numtemp = i * j * k
            Else
                num = 0
            End If

            If numtemp > num Then
                num = numtemp
            End If

            test = test + 1
        Loop

        Count_Num = num
End Function

我的思想,把小长方型变换形状,例如 (5,4,3) 最多6种组合。一种一种组合往大长方型里的往里塞,塞的最多的即是。

我测试了这个数据:(26, 19, 13)最多能放162个(7, 2, 2)。

#26


那你这样就是说全部的小长方体都按同一种摆放方式塞到大长方体里,这显然不对,比如虽然竖着放已经塞满了但是上面还有一部分空间够躺着放的怎么办?

#27


是190个。
用我的算法。

#28


yitianyitian(一天一天):

假设某次剩下的空间划成3个长方体a、b、c,这不是忽略了有另一个小长方体跨越a、b的情况么?

#29


这个确实比较难。我想了个思路,但是没有进行严谨的证明。
假设一个a,b,c长方体,其可以最多放入的m,n,k小长方体的个数为C( p )个。现在问题的关键是这个p和这个2个长方体有什么关系?
现在我们可以简化这个问题,假如放入的是正方体,那么很明显,放入的个数是常数。
所以我们可以做以下2种猜测
1:可以考虑把这个大长方体,划分为若干个以Max(m,n,k)为边的正方体。
2:可以考虑把几个这样的小长方体逼近成一个正方体。
那么这个p就是能放入这样正方体的个数,如果余下的部分可以用继续试探。这个现在的问题的关键是,能否证明余下的部分是最少的余下部分。

#30


to ZeroGts(白水文方) 
认真看下我的算法和例子你就明白了

#31


学习

#32


chenqiu1024 讲的对阿 我忽视这个问题啦。

#33


yitianyitian(一天一天):

你说2d的你证明过,那么这个数据你怎么做?

大,7*7
小,3*4

你的算法是3个吧,但是能放4个。

#34


我完了。
那个证明是我论文的一部分

#35


我觉得还有一个更好的摆放方法,因为我的数据结构不太好,所以呢,我只给出我的想法。

你的问题我明白一点点,但不知道对不对啊。

就是大的长方体中能放多少个小的长方体,你要求的算法,能应用于别人给你的任何值,是吗?
我举个例吧!
假如别人给你:大的长方体:长为10CM,宽为5CM,高为2CM。
              小的长方体:长为 5CM,宽为3CM, 高为0.7CM。
现在求大的长方体中,最多能放多少个小的长方体?

我的算法思路是这样想的,不能穷举法,不知道行不行,那位师兄可以写代码证实一下。因为我的开发语言还没有到那种程序。
首先,如果我们来摆这个长方体的话,是按大长方体的大小来放小的长方体的位置(如果是横,纵,斜),我想了一下,如果彩斜的话,应该摆不了多少!那最佳的办法应该是彩横或纵的摆放方法,现在就要确定采用横或者纵的方法了。怎么确定呢?因为人家给你了长方体的大小,所以,用大的长方体的体积/小的长方体的体积=能摆放最多小长方体的体积。求出了最大数量,那么来设计算法:
按大的长方体:长为10CM,宽为5CM,高为2CM。
  小的长方体:长为 5CM,宽为3CM, 高为0.7CM。当然,这是最好的,因为长,宽,高,都一一对应。那么,计算机却不知道哪是高,哪是长,哪是宽吧!我们就做一个判断(就同我们不知道那一边是高,那一边是长一样)。
    设大长方体:长=max(5,10,2); 这样,长=10;在余下的两边中选宽=max(5,2),  宽=5;高=2
    设小长方体:长=max(0.7,5,3);这样,长=5; 在余下的两边中选宽=max(0.7,3),宽=3;高=0.7
因为我们已经从上面的判断中,让计算机知道了,大小长方体的长,宽,高,那么,我们就可以让计算机按小的长方体的长的一边,摆在大的长的一边,宽摆在宽的一边,摆在高的一边。这样,就已经得出了按需摆事实放所占地空间,然后我们也得出了按需摆放的数量。然后把这个数量和上面的“大的长方体的体积/小的长方体的体积=能摆放最多小长方体的体积。求出了最大数量”比较,看一看是不是最佳的算法。
先想像成一个二维空间,此刻不是立体的。
来看一看我怎么写的吧!
大的长方体的长除以小的长方体的长,得到有多少个了。和最大的比较,不等,那么不是我们想要的最佳摆法,就存在可能在摆放最后的几个小长方体的数量的过程中,占用了多的空间,我们就按边来设计最后几个立体的摆放算法。怎么设计呢?首先我们要确定,横向摆放到几个的时候,我们要改变摆放的位置。那我们就写程序让计算机拿出一个小的长方体,然后再比较大的长方体余下的空间的长,是不是正好等于或者大于小长方体的长。如果是,那么摆放一个,如果不是,那么已经是这个大的长方体余下的空间已经是横摆的最小空间了,就让计算机做判断,余下空间的长,和小长方体的宽比例是多少,如果余下空间的长:小长方体的宽>余下空间的长:小长方体的长。那么我们采用纵摆。

如果算法完成,仍达不到“用大的长方体的体积/小的长方体的体积=能摆放最多小长方体的体积”的最大数量,那么,此算法失败。

我的意思表达得可能不清楚,因为我学历低的原因。我也会用.net语言写一份出来。传给你。
可能要一个星期左右吧!因为我这几天要设计BBS的数据库。所以不好意思啊。

#36


To:Eilien(漂泊的男人)
即使得出的数大于“用大的长方体的体积/小的长方体的体积=能摆放最多小长方体的体积”,也不能说明这个得出的数是我们所要的最大数