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

chy256 2005-11-17 12:55:06
一个大的长方体里面放小长方体。小的长方体不能分,且规格都一样 输出最多能放多少个
...全文
4453 36 打赏 收藏 转发到动态 举报
写回复
用AI写文章
36 条回复
切换为时间正序
请发表友善的回复…
发表回复
chy256 2006-03-05
  • 打赏
  • 举报
回复
To:Eilien(漂泊的男人)
即使得出的数大于“用大的长方体的体积/小的长方体的体积=能摆放最多小长方体的体积”,也不能说明这个得出的数是我们所要的最大数
Eilien 2006-02-19
  • 打赏
  • 举报
回复
我觉得还有一个更好的摆放方法,因为我的数据结构不太好,所以呢,我只给出我的想法。

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

就是大的长方体中能放多少个小的长方体,你要求的算法,能应用于别人给你的任何值,是吗?
我举个例吧!
假如别人给你:大的长方体:长为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的数据库。所以不好意思啊。

yitianyitian 2006-02-09
  • 打赏
  • 举报
回复
我完了。
那个证明是我论文的一部分
ZeroGts 2006-02-08
  • 打赏
  • 举报
回复 1
yitianyitian(一天一天):

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

大,7*7
小,3*4

你的算法是3个吧,但是能放4个。
shichaoreal 2006-02-04
  • 打赏
  • 举报
回复
chenqiu1024 讲的对阿 我忽视这个问题啦。
languagec 2006-02-04
  • 打赏
  • 举报
回复
学习
yitianyitian 2006-02-04
  • 打赏
  • 举报
回复
to ZeroGts(白水文方)
认真看下我的算法和例子你就明白了
peter_cheny 2006-02-03
  • 打赏
  • 举报
回复
这个确实比较难。我想了个思路,但是没有进行严谨的证明。
假设一个a,b,c长方体,其可以最多放入的m,n,k小长方体的个数为C( p )个。现在问题的关键是这个p和这个2个长方体有什么关系?
现在我们可以简化这个问题,假如放入的是正方体,那么很明显,放入的个数是常数。
所以我们可以做以下2种猜测
1:可以考虑把这个大长方体,划分为若干个以Max(m,n,k)为边的正方体。
2:可以考虑把几个这样的小长方体逼近成一个正方体。
那么这个p就是能放入这样正方体的个数,如果余下的部分可以用继续试探。这个现在的问题的关键是,能否证明余下的部分是最少的余下部分。
ZeroGts 2006-02-02
  • 打赏
  • 举报
回复
yitianyitian(一天一天):

假设某次剩下的空间划成3个长方体a、b、c,这不是忽略了有另一个小长方体跨越a、b的情况么?
chenqiu1024 2006-02-01
  • 打赏
  • 举报
回复
那你这样就是说全部的小长方体都按同一种摆放方式塞到大长方体里,这显然不对,比如虽然竖着放已经塞满了但是上面还有一部分空间够躺着放的怎么办?
yitianyitian 2006-02-01
  • 打赏
  • 举报
回复
是190个。
用我的算法。
shichaoreal 2006-01-30
  • 打赏
  • 举报
回复 1
感觉不复杂啊,给出我的程序: 也可能我理解不对。

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)。
chenqiu1024 2006-01-27
  • 打赏
  • 举报
回复
MARKED,STUDYING
Kid4you 2006-01-26
  • 打赏
  • 举报
回复
多维的背包...
sailor_Song 2006-01-26
  • 打赏
  • 举报
回复
学习
yitianyitian 2006-01-22
  • 打赏
  • 举报
回复
立体的我没有证明过。
不过平面的我证明过(即大长方形里放小长方形)。
证明过程比较长且有一些比较麻烦的公式符号。所以就不列出来了。
chy256 2005-12-31
  • 打赏
  • 举报
回复
yitianyitian(一天一天)
我重新看了一下你的第一个贴,发现我以前可能误解了你的意思。按我以前的设想是:先在大长方体的角落处按任意方式放一个小长方体,剩下的空间刚好可以划分成3个长方体。而你的意思应该是先按一种方式往大长方体里面装小长方体,直到这种方式下不能在往大长方体里装小长方体为止,这时再把剩余的空间划分为3个长方体,此时再看其他的方式能不能放下去。但你这样好像不能保证最终得到的结果是最好的结果。

ppass(老毛)
呵呵,你跟这道题挺有缘的呀。请指教!!!
ppass 2005-12-18
  • 打赏
  • 举报
回复
我98年的面试题.....
yitianyitian 2005-12-15
  • 打赏
  • 举报
回复
你把6个摆放情况都算出来。用MAX函数就可以输出最大的个数
chy256 2005-12-15
  • 打赏
  • 举报
回复
To:yitianyitian(一天一天)
你这种方法我也想过,这种方法可以遍历所有的摆放情况,但我想不出来怎么输出最大的摆放个数

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

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

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧