求解算法问题,急求解法!!!!
问题如下:
在给定体积的容器R,有数个不同体积的物体(如有三个物体x,y,z,且x!=y!=!z,x<R,y<R,x<R),问如何最大数量的在R内放置x,y,z?
望各位高手给出算法,急啊!!!!
问题点数:0、回复次数:11Top
1 楼diaopeng(放飞自己)回复于 2003-11-03 12:32:40 得分 0
使用穷举法或回溯法可以解决这个问题Top
2 楼diaopeng(放飞自己)回复于 2003-11-03 13:14:14 得分 0
算法设计思想如下:
一、判断x、y、z的大小,确定是从最小开始还是从最大开始;(假如x>y>z)
二、首先在R中放上x,一直到不能再放,那么回溯;
三、继续放y,方法跟上面一样;
四、接下来放z,方法同上,只是不需要再回溯了;
五、统计R中共放了几个x、y、zTop
3 楼zzwu(未名)回复于 2003-11-03 13:59:00 得分 0
x!=y!=!z 的意思不懂: !zTop
4 楼cyj2008(cyj)回复于 2003-11-03 14:03:30 得分 0
楼主的问题描述不清楚,不知道所谓的容器是方形,还是球形,还是不规则形??
Top
5 楼yhwh(我要飞)回复于 2003-11-03 14:29:22 得分 0
x!=y!=!z 写错了,因该是x!=y!=z 就是,x,y,z互不相等
容器是长方形!!!
Top
6 楼v_salt(加点盐)回复于 2003-11-03 16:52:22 得分 0
看来只有回溯Top
7 楼leyt(思维机器)回复于 2003-11-03 17:37:58 得分 0
同意用回溯Top
8 楼apogeecsj(skysword)回复于 2003-11-03 23:34:26 得分 0
用回溯:
设有n个物体体积数组v[n]
bool put[n]; //对应第i个物体放和不放,放则true
void back_track( int k )
{
if( k >= n )
{ 得到一种放法 }
for( int i = 0;i <= 1; i++ )
{ put[k] = i;
if( ok() ) //放了k后没有超过容器容积
{
back_track( k+1 );
}
}
}
回溯还可以一边把当前解和当前最优的比较来限制Top
9 楼dengsf(drklnk@Radical_Dreamer)回复于 2003-11-04 09:42:36 得分 0
有没有形状限制?Top
10 楼stephen85()回复于 2003-11-04 11:28:38 得分 0
关注!Top
11 楼HUNTON(追求完美)回复于 2003-11-04 16:54:25 得分 0
有形状限制的以前讨论过,不过好象没有什么好的解法。Top




