為了提高一套暢銷系列書(全套共 5 本)的銷量,某間書店決定推出多本合購的折扣。
這五本書不管是哪一本,單買一本都是 $8。
不過,如果你買兩本不同的書,這兩本就能享有 5% 折扣。
買 3 本不同的書,可以享有 10% 折扣。
買 4 本不同的書,可以享有 20% 折扣。
5 本全買,可以享有 25% 折扣。
要注意的是,如果你買了 4 本書,其中 3 本是不同的書名,那麼湊成一套的那 3 本可以享有 10% 折扣,但第 4 本仍然是 $8。
你的任務是寫程式,計算出任何想得到的購物籃價格(籃中只會裝同一系列的書),並盡可能給出最大的折扣。
舉例來說,下面這一籃書要多少錢?
把這 8 本書分組,其中一種分法是:
這樣總共會是:
計算結果為:
總共是 $51.60。
不過,這 8 本書還有另一種分組方式:
這樣總共會是:
計算結果為:
總共是 $51.20。
而 $51.20 就是折扣最大的價格。
WebAssembly 匯出 total 的函式簽章如下:
(func (export "total")
(param $basketOffset i32)
(param $basketLength i32)
(result i32)
)
兩個參數 $basketOffset 和 $basketLength 分別表示一個 32 位元整數陣列的基底位移與長度。長度參數的單位是陣列中的元素個數,而不是位元組數。在呼叫這個函式之前,呼叫者會把這個陣列寫入從位移 $basketOffset 開始的 WebAssembly 線性記憶體。WebAssembly 線性記憶體一律以小端序表示。
舉例來說,呼叫者會把購物籃 [1,2] 編碼成下列八個位元組的序列。
| 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 |
| --- basket[0] --- | --- basket[1] --- |
,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,