木工坊有 n 块木板,每块高度为 1、宽度为 2^{x_i}(即宽度一定是 2 的整数次幂)。现在要把它们全部装进宽度为 W 的储物箱里。
装箱规则:
- 每一层从箱底开始水平排放若干木板,木板的宽度和不能超过该层的宽度 W;
- 一层放满(剩余宽度放不下任何一块还没装箱的木板)后,才能开始放新的一层;
- 木板的顺序可以任意选择,每块木板必须恰好放在某一层。
求最少需要多少层,才能装下全部木板。
第一行一个整数 t,表示数据组数。
每组数据两行:第一行两个整数 n 和 W;第二行 n 个整数 w_1, w_2, \dots, w_n(保证每个 w_i 都是 2 的整数次幂)。
对每组数据输出一行一个整数,表示最少层数。
2 5 16 1 2 8 4 8 6 10 2 8 8 2 2 8
2 3
第 1 组:一层放 8+8=16,另一层放 4+2+1=7\le 16,共 2 层。
第 2 组:三层分别放 8+2、8+2、8+2,每层宽度恰好 10,共 3 层;可以验证 2 层无法装下(总宽度 30 > 20)。
对于全部数据,保证 1 \le t \le 5\times 10^3,1 \le n \le 10^5(所有组 n 之和不超过 10^5),1 \le W \le 10^9,1 \le w_i \le 10^6,且每个 w_i 均为 2 的整数次幂。
| 20% | 1~5 | 20 | n \le 10,W \le 64 |
| 60% | 6~15 | 40(累计 60) | 所有组 n 之和 \le 1000 |
| 100% | 16~25 | 40(累计 100) | 所有组 n 之和 \le 10^5,W \le 10^9 |
| 时间限制 | 1 秒 |
| 内存限制 | 128 MB |