01 背包問題。物品重量 w ≤ 2^30,但每個 w 可分解為 a × 2^b (a ≤ 10, b ≤ 30)。背包容量 W ≤ 2^30。求最大價值。
將物品按指數 b 分為 31 層 (0~30)。第 b 層物品重量形如 a×2^b (a≤10)。
定義 `f[b][j]`:在考慮前 b 層(即低 b 位)物品時,剩餘容量為 `j×2^b + (W & (2^b-1))` 的最大價值。j ≤ 1000 足夠(因 a≤10,總重量低位貢獻有限)。
for (int j = min(1000, W>>b); j >= 0; j--)
for (int k = 0; k <= j; k++)
f[b][j] = max(f[b][j], f[b][j-k] + f[b-1][min(k*2 + ((W>>(b-1))&1), 1000)]);
含義:在第 b 層花費 k×2^b 容量,剩餘 (j-k)×2^b 留給低層;低層可用容量折算為第 b-1 層的單位數為 `k*2 + 當前位`。