先讓 \(p\) 除以 \(100\),相當於給你兩個陣列 \(p, w\),然後要選擇下標集合 \(S\),使得:
\(p\) 的積乘上 \(w\) 的和最大化。
注意到 \(p_i\) 是整數,並且 \(1\le p_i \le 100\)。
那麼容易想按照 \(p_i\) 分類。
然後 \(w_i\) 對於固定 \(p\) 一定是選擇排序後的最大值字尾。
目前 \((P,Q)\),考慮選擇 \(i\):
\[P\cdot W \to P\cdot p_i\times(W+w_i)
\]
一定是後面的式子大於前面的式子才會選擇,考慮做比例,那麼不等式就是:
\[p_i+\frac{p_i\cdot w_i}{W} > 1\\
p_i\cdot w_i>(1-p_i)\cdot W
\]
把 \(p\) 再乘回去:
\[p_i\cdot w_i>(100-p_i)\cdot W
\]
題意有:\(p_i\cdot w_i \le 2\cdot 10^5\)。
所以 \(W\) 最後不會很大,只會在 \(2\cdot 10^5\) 以內。
然後我們考慮按 \(p_i\) 分類。
假設選擇了某個 \(p_i\) \(c\) 個,然後考慮選入的最小的值是 \(w_i\),考慮它不能刪除時:
令:\(q_i=p_i/100\):
\[P\cdot q_i^c\times(W+w_i\cdot c+\Delta) > P\cdot q_i^{c-1}\times(W+w_i\cdot(c - 1) + \Delta)\\
q_i\cdot(W+w_i\cdot c+\Delta) > W+w_i\cdot(c - 1) + \Delta\\
(q_i-1)\cdot w_i\cdot c > (W + \Delta)(1-q_i) -w_i
\]
然後只需要考慮 \(\Delta=0\) 的情況,限制更加嚴格:
\[(q_i-1)\cdot w_i\cdot c > W(1-q_i) -w_i\\
c < -\frac{W}{w_i}+\frac{1}{1-q_i}<\frac{100}{100-p_i}
\]
也就是說對於一種機率 \(p_i\) 的物品,最多選擇 \(\frac{100}{100-p_i}\) 個
\[\sum_{i=0}^{99}\frac{100}{100-p_i} = 100\ln 100\approx482
\]
然後對於機率等於 \(100\) 的物品無腦全部選入即可。
這裡直接用 \(dp_{i,j}\) 表示考慮完前 \(i\) 種物品,目前 \(W=j\) 時的最大的 \(P\)。
最終複雜度就是 \(O(2\cdot 10^5\times 482)\)。
程式碼