123
返回列表 发新帖

[讨论] kkkkkkkkkkkkkkkkkkkk

 关闭 [复制链接]
21#
 楼主| 发表于 2010-4-18 14:05 | 只看该作者
学习

使用道具 举报

回复
22#
 楼主| 发表于 2010-4-20 17:02 | 只看该作者

回复 #19 newkid 的帖子

newkid关于贪婪算法的代码里有个小小的失误, 在SELECT * BULK COLLECT INTO lv_p FROM pack ORDER BY val/weight这个语句里,应该从大到小排序,所以应该最后加个 DESC ,这样在后面的贪婪过程中才能得到最优解

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
23#
发表于 2010-4-20 22:52 | 只看该作者
原帖由 爱上狮子座女孩 于 2010-4-20 17:02 发表
newkid关于贪婪算法的代码里有个小小的失误, 在SELECT * BULK COLLECT INTO lv_p FROM pack ORDER BY val/weight这个语句里,应该从大到小排序,所以应该最后加个 DESC ,这样在后面的贪婪过程中才能得到最优解


确实是这样,应该是“价值密度”大的优先。
其实那个内存数组都可以去掉,直接用个游标就行了:

DECLARE
   
   lv_limit NUMBER := 10;    ------ 重量限制
   m NUMBER := lv_limit;

BEGIN
   FOR lv_rec IN (SELECT * FROM pack ORDER BY val/weight DESC) LOOP
       DBMS_OUTPUT.PUT('(id='||lv_rec.id||' w='||lv_rec.weight||' v='||lv_rec.val||')-------');

       IF lv_rec.weight>m THEN
          DBMS_OUTPUT.PUT_LINE(m/lv_rec.weight);
          EXIT;
       ELSE
          DBMS_OUTPUT.PUT_LINE(1);
          m := m - lv_rec.weight;
          IF m=0 THEN
             EXIT;
          END IF;
       END IF;

   END LOOP;
   
END;
/

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
24#
发表于 2010-4-22 09:02 | 只看该作者
穷尽法:利用11GR2的递归WITH子查询:

WITH t (id , total_w , total_v , nodes ) AS (
  SELECT id,weight,val,'(id='||id||' w='||weight||' v='||val||')'
    FROM pack
   WHERE weight<=10    --- 假设限制为10
UNION ALL
SELECT p.id,p.weight + t.total_w,p.val + t.total_v,nodes||' (id='||p.id||' w='||p.weight||' v='||p.val||')'
  FROM pack p,t t
WHERE t.id<p.id
       AND p.weight + t.total_w<=10   --- 假设限制为10
  )
SELECT nodes,total_v
  FROM (SELECT * FROM t ORDER BY total_v DESC)
WHERE ROWNUM=1;

(id=1 w=2 v=6) (id=2 w=2 v=3) (id=5 w=4 v=6)    15

比起#14的PLSQL版本,这个SQL不能够及时甩掉明显不是最优的解。

使用道具 举报

回复
论坛徽章:
58
生肖徽章2007版:马
日期:2009-11-06 23:12:33授权会员
日期:2013-01-10 14:38:592013年新春福章
日期:2013-02-25 14:51:24马自达
日期:2013-08-07 10:54:45红旗
日期:2013-08-09 13:48:48劳斯莱斯
日期:2013-09-12 15:56:37萤石
日期:2013-10-31 08:44:19优秀写手
日期:2013-12-18 09:29:13Jeep
日期:2014-01-14 10:53:432014年新春福章
日期:2014-02-18 16:43:09
25#
发表于 2011-4-22 11:55 | 只看该作者
newkid师傅厉害!

使用道具 举报

回复
论坛徽章:
5
26#
发表于 2011-4-22 13:54 | 只看该作者
为啥标题和1楼都变成k*了?

使用道具 举报

回复
论坛徽章:
46
凯迪拉克
日期:2013-08-22 10:00:10Jeep
日期:2013-08-10 07:21:13ITPUB社区12周年站庆徽章
日期:2013-10-08 14:57:28ITPUB十周年纪念徽章
日期:2011-11-01 16:20:282012新春纪念徽章
日期:2012-01-04 11:49:54ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07奥运会纪念徽章:体操
日期:2008-10-24 13:08:31会员2007贡献徽章
日期:2007-09-26 18:42:10马上加薪
日期:2014-04-11 09:34:11秀才
日期:2015-09-06 10:19:32
27#
发表于 2011-4-22 19:18 | 只看该作者
不知道.

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
9
生肖徽章2007版:牛
日期:2009-03-10 21:26:492010新春纪念徽章
日期:2010-01-04 08:33:082010年世界杯参赛球队:葡萄牙
日期:2010-02-22 14:35:242010新春纪念徽章
日期:2010-03-01 11:19:092010广州亚运会纪念徽章:射击
日期:2010-09-08 23:42:12ITPUB9周年纪念徽章
日期:2010-10-08 09:31:212010广州亚运会纪念徽章:拳击
日期:2010-10-30 00:46:582011新春纪念徽章
日期:2011-02-18 11:43:322011新春纪念徽章
日期:2011-03-01 08:49:39
28#
发表于 2011-4-22 19:50 | 只看该作者
怎么个情况,内容都变成了 kkkkkk
楼下dingjun和newkid都非常卖力地回答,很诡异啊。

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
29#
发表于 2011-4-22 19:59 | 只看该作者
楼主不知道珍惜他人的回答,拿了答案就撤人,这行为很不好。
锁帖。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表