[心得] 有多少種換飲料的方法

看板Mathematica作者 (Hysterisis)時間10年前 (2014/05/30 01:59), 10年前編輯推噓2(202)
留言4則, 3人參與, 最新討論串1/1
Math版的問題 飲料一瓶2元,4個瓶身能換1瓶,2個瓶蓋也能換1瓶。今有20元,最多可以喝幾瓶。 把題目改造成等價的東西,擁有的 (蓋,身) 數量是一個狀態 起始是(10,10),換蓋子移動(-1,1),換瓶身移動(1,-3),不可以停留在X/Y軸上 稍作探討可以發現最佳結果必然是最後停在(1,3) 瓶身值0.5元,瓶蓋值1元,飲料本身值0.5元,因此可以喝到 (20-1-1.5)/0.5 = 35瓶 這時候就想,假設一天換一次,總共有幾種獨特的兌換(走格子點)的方法? 果斷打開MMA Clear[a]; a[_, _] = 0; (*除了有定義之外,預設值為零*) (*a是個虛擬的陣列,實際上是tag 於 head "a"之下的百餘個儲存的定義。MMA像是 個巨大的表達式/規則比對引擎*) a[10,10] = 1; a[11,7] = 1; a[12,4] = 1; a[13,1] = 1; a[9,11] = 1; a[8,12] = 1; a[7,13] = 1; a[6,14] = 1; a[5,15] = 1; a[4,16] = 1; a[3,17] = 1; a[2,18] = 1; a[1,19] = 1; (*高中排組的捷徑問題那技巧*) out[x_, y_] := x < 1 || x > 13 || y < 1 || y > 19; While[a[1, 3] == 0, Do[ Do[ If[And[ a[x + 1, y - 1] != 0 || out[x + 1, y - 1], a[x - 1, y + 3] != 0 || out[x - 1, y + 3]], a[x, y] = a[x + 1, y - 1] + a[x - 1, y + 3] ], {y, 1, 20 - x}]; , {x, 1, 13}]; ]; a[1, 3] Transpose@(Reverse /@ Table[a[x, y], {x, 1, 13}, {y, 1, 19}]) // MatrixForm (*把電腦表格順序改成我們慣看的x-y軸排列,就是行倒置,然後轉置*) 結果: 186360 種,跟一個表格debug用 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.112.213.88 ※ 文章網址: http://www.ptt.cc/bbs/Mathematica/M.1401386380.A.08F.html ※ 編輯: jurian0101 (140.112.213.88), 05/30/2014 02:00:12

05/30 08:15, , 1F
是說把迭代順序倒過來的話就不用 While 了
05/30 08:15, 1F

05/30 08:15, , 2F
(這有一個名詞叫動態規劃, Dynamic Programming)
05/30 08:15, 2F

05/30 13:01, , 3F
睡前五分鐘的急急忙忙,就沒去想效率問題了。
05/30 13:01, 3F

05/31 01:32, , 4F
m(__)m
05/31 01:32, 4F
文章代碼(AID): #1JXtMC2F (Mathematica)
文章代碼(AID): #1JXtMC2F (Mathematica)