1. 程式人生 > >寫點東西(關於背包問題)

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

單調隊列 分治 上界 背包 背包問題 block 復雜度 mat 個數

一些有趣的背包迷題。

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)\)

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