一些有趣的揹包迷題。優化
對於無限揹包方案數,至關於單調不降序列方案數。spa
對於\(i\in [a,a+b-1]\)範圍內,體積爲\(i\)的物品有無限個,求裝滿\(T\)的方案數。
\(f_{i,j} = f_{i-1,j-a} + f_{i,j-i}\)隊列
討論一下物品個數上界來肯定\(i\)的枚舉範圍。io
關於多重揹包,按照\(\% V\)單調隊列優化:
\(f_{i,aV+d} = f_{i,(a-cs)V+d} + cs*W\)
令\(a-cs = k\)有:
\(f_{i,aV+d} - aW = f_{i,kV + d} - csW ; \ \ \ k \geq a - Cnt\)class
有\(i\)個物品,第\(i\)個物品有\(i\)個,體積爲\(i\),求裝滿\(T\)的方案數。
分塊:block
關於無限揹包其實還能夠更優秀一些:
\(\prod \frac{1}{1-x^{V_t}} = e^{-\sum_{t} ln(1-x^{V_t})}\)
而後:
\(ln(1-x^{V_t}) = -\int \frac{-V_tx^{V_t-1}}{1-x^V_t} = -\int \sum_{j=0}^{\inf} V_tx^{(j+1)V_t - 1} = -\sum_{j=1}^{\inf} \frac{x^{jV_t}}{j}\)。
調和級數加貢獻後多項式\(exp\)便可。math
\(0/1\)揹包還能夠更加毒瘤一點。
假設每一個物品的體積特別小,如今求填滿\(T\)的方案數。
按照體積枚舉物品,對於同一體積,確定優先選價值大的,設選\(i\)個的價值爲\(W_i\)。
枚舉體積\(V\)的剩餘類\(d\),有:
\(f_{Vi+d} = f'_{Vj+d} + W_{i-j}\),每次作完一個\(V\)後再\(f_{i} = max(f_{i},f_{i-1})\)。
\(W_{i}\)的斜率遞減。
因此對於每個剩餘類,決策單調,用分治解決,複雜度變爲\(O(MaxV*TlogT)\)。枚舉