用1分、5分、10分、25分、50分硬币凑成一元,每种硬币的个数没有限制,总共有几种组合方法?
用connect by 方法
select '1*'||c1.cnt
||'+5*'||c5.cnt
||'+10*'||c10.cnt
||'+25*'||c25.cnt
||'+50*'||c50.cnt as result
from ( select rownum-1 cnt from dual connect by rownum-1<=100) c1,
( select rownum-1 cnt from dual connect by rownum-1<=20) c5,
( select rownum-1 cnt from dual connect by rownum-1<=10) c10,
( select rownum-1 cnt from dual connect by rownum-1<=4) c25,
( select rownum-1 cnt from dual connect by rownum-1<=2) c50
where 1*c1.cnt
+5*c5.cnt
+10*c10.cnt
+25*c25.cnt
+50*c50.cnt = 100;
用递归with 方法
with coin as (
select 1 cents from dual
union all select 5 cents from dual
union all select 10 cents from dual
union all select 25 cents from dual
union all select 50 cents from dual
),
t(current_coin,total_val,c1,c5,c10,c25,c50) as(
select 0,0,0,0,0,0,0 from dual
union all
select c.cents,
t.total_val+c.cents,
c1+decode(c.cents,1,1,0),
c5+decode(c.cents,5,1,0),
c10+decode(c.cents,10,1,0),
c25+decode(c.cents,25,1,0),
c50+decode(c.cents,50,1,0)
from t,coin c
where t.total_val + c.cents <=100
and t.current_coin<=c.cents
)
select '1*'||c1
||'+5*'||c5
||'+10*'||c10
||'+25*'||c25
||'+50*'||c50 as result
from t
where total_val=100;
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/69908786/viewspace-2632984/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/69908786/viewspace-2632984/