寫點東西(關於揹包問題)

一些有趣的揹包迷題。優化

Section1

對於無限揹包方案數,至關於單調不降序列方案數。spa

對於\(i\in [a,a+b-1]\)範圍內,體積爲\(i\)的物品有無限個,求裝滿\(T\)的方案數。
\(f_{i,j} = f_{i-1,j-a} + f_{i,j-i}\)隊列

討論一下物品個數上界來肯定\(i\)的枚舉範圍。io

Section2

關於多重揹包,按照\(\% 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

Section3

\(i\)個物品,第\(i\)個物品有\(i\)個,體積爲\(i\),求裝滿\(T\)的方案數。
分塊:block

  • 對於體積\(\leq \sqrt{T}\),暴力枚舉,使用單調隊列。
  • 對於體積\(>\sqrt{T}\),用\(Section1\)中的解法解決。

Section4

關於無限揹包其實還能夠更優秀一些:
\(\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

Section4

\(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)\)枚舉

相關文章
相關標籤/搜索