寫點東西(關於背包問題)
一些有趣的背包迷題。
Section1
對於無限背包方案數,相當於單調不降序列方案數。
對於\(i\in [a,a+b-1]\)範圍內,體積為\(i\)的物品有無限個,求裝滿\(T\)的方案數。
\(f_{i,j} = f_{i-1,j-a} + f_{i,j-i}\)
討論一下物品個數上界來確定\(i\)的枚舉範圍。
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\)
Section3
有\(i\)個物品,第\(i\)個物品有\(i\)個,體積為\(i\),求裝滿\(T\)的方案數。
分塊:
- 對於體積\(\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\)即可。
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)\)。
寫點東西(關於背包問題)