一直公鷄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