ITPub博客

首页 > 数据库 > Oracle > 硬币谜题

硬币谜题

翻译 Oracle 作者:yuzhipeng 时间:2019-02-14 11:14:31 0 删除 编辑

用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博客 ” ,链接:https://blog.itpub.net/69908786/viewspace-2632984/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: 邮票谜题
请登录后发表评论 登录
全部评论
学无止境,永不止步

注册时间:2019-01-28

  • 博文量
    6
  • 访问量
    11359