kdb+練習:百元買百雞問題

一直公鷄5元,一直母鷄3元,三隻小鷄一元。
用100元去買這三種雞,要求剛好花光這100元。
問這些組合都是什麽?

這個題可以用kdb+中的cross來解決,但是換一種方法來解決

male: 1+til 20
female: 1+til 34
chick: 1+til 300

先看公鷄和母鷄的組合:

f1:{[ma;fe] ma {x,y,(5*x)+3*y}\: fe}

公鷄和母鷄的組合結果與小鷄的組合:

f2:{[ch;mafe] ch {x,y,(x%3)+y}\: mafe}

把公鷄,母鷄,小鷄組合起來:

raze f2[chick;]each raze f1[male;]each female
q)raze f2[chick;]each raze f1[male;]each female
1  1 1 8.333333
2  1 1 8.666667
3  1 1 9f      
4  1 1 9.333333
5  1 1 9.666667
6  1 1 10f     
7  1 1 10.33333
8  1 1 10.66667
9  1 1 11f     
10 1 1 11.33333
11 1 1 11.66667
12 1 1 12f     
13 1 1 12.33333
14 1 1 12.66667
15 1 1 13f     
16 1 1 13.33333
17 1 1 13.66667
18 1 1 14f     
19 1 1 14.33333
20 1 1 14.66667
21 1 1 15f     
22 1 1 15.33333
..

例如第三行:三隻小鷄+一隻公鷄+一隻母鷄 = 3/3 + 51 + 31 = 9

現在要找出花費等於100的組合:

ls:raze f2[chick;]each raze f1[male;]each female
ls where 100=ls[;3]
q)ls where 100=ls[;3]
276 1  1 100f
261 2  1 100f
246 3  1 100f
231 4  1 100f
216 5  1 100f
201 6  1 100f
186 7  1 100f
171 8  1 100f
156 9  1 100f
141 10 1 100f
126 11 1 100f
111 12 1 100f
96  13 1 100f
81  14 1 100f
66  15 1 100f
51  16 1 100f
36  17 1 100f
21  18 1 100f
6   19 1 100f
267 1  2 100f
252 2  2 100f
237 3  2 100f
..

驗證結果:
第二行: 261/3 + 2*5 + 3 = 100

不過這裏可以看出小鷄的數量已經超過100,不符合要求。

ls1:ls where 100=ls[;3]
ls1 where 100=sum each ls1[;0 1 2]
q)ls1:ls where 100=ls[;3]
q)ls1 where 100=sum each ls1[;0 1 2]
84 12 4  100f
81 8  11 100f
78 4  18 100f

最後驗證: 84/3 + 12x5 + 4x3 = 100
81/3 + 8x5 + 11x3 = 100
78/3 + 4x5 + 18x3 = 100

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值