查看: 5543|回复: 23

写一个求和的程序,谢谢

[复制链接]
论坛徽章:
1
ITPUB十周年纪念徽章
日期:2011-11-01 16:26:59
跳转到指定楼层
1#
发表于 2011-5-30 14:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
we have a list of integer {1, 2, 3, 4, 5, 6, 7, 8, 9 }. Set each item as R, where i = 1..9.

write code to return each possible combination whose sum is less or equal to 25.

For example,

1;
1,2;
1, 2, 3;
....
论坛徽章:
1088
金色在线徽章
日期:2007-04-25 04:02:08金色在线徽章
日期:2007-06-29 04:02:43金色在线徽章
日期:2007-03-11 04:02:02在线时间
日期:2007-04-11 04:01:02在线时间
日期:2007-04-12 04:01:02在线时间
日期:2007-03-07 04:01:022008版在线时间
日期:2010-05-01 00:01:152008版在线时间
日期:2011-05-01 00:01:342008版在线时间
日期:2008-06-03 11:59:43ITPUB年度最佳技术原创精华奖
日期:2013-03-22 13:18:30
2#
发表于 2011-5-30 20:29 | 只看该作者
SQL> WITH t AS
  2  (SELECT LEVEL val FROM dual
  3  CONNECT BY LEVEL<10)
  4  SELECT   trim(both ',' FROM a.val_list) val_list
  5     FROM
  6   (SELECT SYS_CONNECT_BY_PATH (val, ',') || ',' val_list
  7               FROM   t
  8               CONNECT BY  val > PRIOR val) a, t b
  9      WHERE    INSTR (a.val_list, ',' || b.val || ',') > 0
10      GROUP BY a.val_list
11     HAVING   SUM (b.val) <= 25
12  ORDER BY 1;

VAL_LIST
--------------------------------------------------------------------------------
1
1,2
1,2,3
1,2,3,4
1,2,3,4,5
1,2,3,4,5,6
1,2,3,4,5,7
1,2,3,4,5,8
1,2,3,4,5,9
1,2,3,4,6
1,2,3,4,6,7

...............
6,8,9
6,9
7
7,8
7,8,9
7,9
8
8,9
9

323 rows selected

使用道具 举报

回复
论坛徽章:
2
2011新春纪念徽章
日期:2011-01-04 10:38:212011新春纪念徽章
日期:2011-02-18 11:43:33
3#
发表于 2011-5-30 20:53 | 只看该作者
老丁做法不错,娴熟的运用了SQL的各种函数,打到求解的目的

但是感觉没做到效率上的最大化,很多无效的组合可以不用去尝试的。。感觉

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
4#
发表于 2011-5-30 21:06 | 只看该作者
with t as(select level l from dual connect by level<=9)
,u (l,s) as (select cast(l as varchar(100)) l,l s from t
union all
select t.l||','||u.l l,u.s+t.l s from u,t where
cast(t.l as varchar(100))< substr(u.l,1,1) and u.s+t.l<=25)
select l from u ;

使用道具 举报

回复
论坛徽章:
519
奥运会纪念徽章:垒球
日期: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
5#
发表于 2011-5-30 21:39 | 只看该作者
原帖由 影之哀伤 于 2011-5-30 20:53 发表
老丁做法不错,娴熟的运用了SQL的各种函数,打到求解的目的

但是感觉没做到效率上的最大化,很多无效的组合可以不用去尝试的。。感觉

你来写一个?
递归WITH可以在遍历过程中求和。

使用道具 举报

回复
论坛徽章:
41
2010广州亚运会纪念徽章:橄榄球
日期:2011-01-11 06:17:26红孩儿
日期:2012-12-19 11:07:13玉石琵琶
日期:2012-12-19 11:07:13九尾狐狸
日期:2012-12-19 11:07:13嫦娥
日期:2012-12-19 11:07:13玉兔
日期:2012-12-19 11:07:13紫蜘蛛
日期:2012-12-19 11:07:13蓝色妖姬
日期:2012-12-19 11:07:13紫蛋头
日期:2013-01-23 09:04:49SQL大赛参与纪念
日期:2013-12-06 14:03:45
6#
发表于 2011-5-31 02:50 | 只看该作者
Another option:

SQL> WITH t AS
  2   (SELECT LEVEL val FROM dual CONNECT BY LEVEL < 10)
  3  SELECT *
  4    FROM (SELECT ltrim(sys_connect_by_path(val, '+'), '+') vallist,
  5                 extractvalue(dbms_xmlgen.getxmltype('select 0' ||
  6                                                     sys_connect_by_path(val,'+') ||
  7                                                     ' cost from dual'),
  8                              '/ROWSET/ROW/COST') res
  9            FROM t
10          CONNECT BY val > PRIOR val)
11   WHERE res <= 25;

VALLIST                                                                          RES
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
1                                                                                1
1+2                                                                              3
1+2+3                                                                            6
1+2+3+4                                                                          10
1+2+3+4+5                                                                        15
1+2+3+4+5+6                                                                      21
1+2+3+4+5+7                                                                      22
1+2+3+4+5+8                                                                      23
1+2+3+4+5+9                                                                      24
....

使用道具 举报

回复
论坛徽章:
27
ITPUB官方微博粉丝徽章
日期:2011-08-17 10:35:36托尼托尼·乔巴
日期:2017-10-25 16:45:57秀才
日期:2017-04-05 13:18:06秀才
日期:2017-03-02 10:35:322016猴年福章
日期:2016-02-23 09:58:342016猴年福章
日期:2016-02-18 09:31:302015年新春福章
日期:2015-03-06 11:57:312014年新春福章
日期:2014-02-18 16:42:022013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:07:31
7#
发表于 2011-5-31 08:53 | 只看该作者
原帖由 xqmei 于 2011-5-31 02:50 发表
Another option:

SQL> WITH t AS
  2   (SELECT LEVEL val FROM dual CONNECT BY LEVEL < 10)
  3  SELECT *
  4    FROM (SELECT ltrim(sys_connect_by_path(val, '+'), '+') vallist,
  5                 extractvalue(dbms_xmlgen.getxmltype('select 0' ||
  6                                                     sys_connect_by_path(val,'+') ||
  7                                                     ' cost from dual'),
  8                              '/ROWSET/ROW/COST') res
  9            FROM t
10          CONNECT BY val > PRIOR val)
11   WHERE res  


好复杂。。。。。。

使用道具 举报

回复
论坛徽章:
1
2010广州亚运会纪念徽章:田径
日期:2011-05-20 14:27:02
8#
发表于 2011-5-31 16:43 | 只看该作者
with t as (select level val from dual connect by level < 10)
select ltrim(p, ',') from (
  select val, sys_connect_by_path(val, ',') p,
  sys_connect_by_path(rpad('*',val,'*'), '/'),
  length(sys_connect_by_path(rpad('*',val,'*'), '/')) - level cnt
  from t
  connect by prior val < val
) where cnt <= 25

使用道具 举报

回复
论坛徽章:
2
2011新春纪念徽章
日期:2011-01-04 10:38:212011新春纪念徽章
日期:2011-02-18 11:43:33
9#
发表于 2011-5-31 17:41 | 只看该作者
后面的方法感觉大同小异呢。。

如果数组是1至10000,求和数位10的话,大家的语句效率应该不错。。。
看我自己写递归。。。。。。。。。

使用道具 举报

回复
论坛徽章:
519
奥运会纪念徽章:垒球
日期: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
10#
发表于 2011-5-31 22:20 | 只看该作者
原帖由 影之哀伤 于 2011-5-31 17:41 发表
后面的方法感觉大同小异呢。。

如果数组是1至10000,求和数位10的话,大家的语句效率应该不错。。。
看我自己写递归。。。。。。。。。

如果有负数你打算怎么办?

使用道具 举报

回复

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

本版积分规则 发表回复

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