日期:2014-05-19  浏览次数:20407 次

最优逼近算法-用SP实现
现有装箱表

declare   @T   table   (name   varchar(10),volume   decimal(9,2))

insert   @T   select   '1 ', '6.24 '
union   select   '3 ', '8.96 '
union   select   '4 ', '8.10 '
union   select   '5 ', '4.37 '
union   select   '6 ', '10.56 '
union   select   '7 ', '50.89 '
...
union   select   '120 ', '21.69 '
...

name是货名,volume是货物的体积
表T中有N行货物,实际数在100左右
运输货物的集装箱为68立方米
要求:用存储过程实现的算法来输出一份最大限度利用集装箱空间的货物单


------解决方案--------------------
redwoodschu
哪来的题啊....真牛X
------解决方案--------------------
简单逼近很好做,就是选择一个最小的体积足够大的货物,依次递归下去
这个不是挺好吗?
------解决方案--------------------
呵呵,又现高手!
------解决方案--------------------
to : w75251455(砍破)

手上没有环境,测不了砍破的..

如果集装箱是10立方米
货特如下:
name1 2立方米
name2 5立方米
name3 5立方米
name4 9立方米

这种情况选择的是name2和name3
不知道你的算法是否涉及到?

------解决方案--------------------
第一:我没用递归...
------
楼主说的递规也可以写成循环。

第二:不是从最小的~~是最大的~~
----------
楼主说的最小的体积足够大的货物是指小于当前可用空间的最大的。

第三:也不是依次下去~~~是 <=68-@max
-----------------
楼主也是这个意思。

第四:我可以不用临时表!!!!!!!只要你不介意我在你表上多加个列...
---------
我没看你的写法,但觉得你的算法跟楼主是一个意思。

------解决方案--------------------
砍破真牛,我也顶一下
------解决方案--------------------
up
------解决方案--------------------
UP
------解决方案--------------------
递归“从剩下的货物中选择出不大于货箱剩余空间的最大一件装入”
9,9,5,5,3,3,2,1
组合结果就是
9,1
9
5,5
3,3,2

这不就是楼主原来的意思?简单逼近而已。貌似这就够用了
------解决方案--------------------
up

------解决方案--------------------
用贪婪法行吗?

9,9,5,5,3,3,2,2,1 如果集装箱是10
组合结果:
9,1
------解决方案--------------------
DROP TABLE t
--思路,按体积正向排序成#2,排逆向排序为#1,
CREATE TABLE t
(
name varchar(10),
volume decimal(9,2)
)
GO
INSERT INTO t
select '1 ',6.24
union select '3 ',8.96
union select '4 ',8.10
union select '5 ',4.37
union select '6 ',10.56
union select '7 ',50.89
union select '13 ',18.96
union select '14 ',34
union select '15 ',34
union select '16 ',34
union select '16 ',34
union select '17 ',50.89
go
CREATE TABLE #1
(
id int identity(1,1),
name varchar(10),
volume decimal(9,2)
)
go
CREATE TABLE #2
(
id int identity(1,1),
name varchar(10),
volume decimal(9,2),
id1 int
)
go
declare @t1row int,@t2row int,@cnt int,@t1volume int ,@t2volume int,@id1 int,@id2 int
insert into #1(name,volume) select name, volume from t order by volume desc
insert into #2(name,volume) select name, volume from t order by volume