題目描述
有 n
nn 種物品,第 i
ii 種物品第一次選擇的收益是 a
ia_i
ai,之後每次選擇的收益都是 b
ib_i
bi,代價始終為 cici
ci。你需要求出在總代價不超過 m
mm 下收益的最大值。
有 q
qq 次修改,第 j
jj 次修改會在第 i(i
i(ii(
i次修改的基礎上修改乙個物品的兩類收益。你需要對於每次修改後輸出答案。
資料範圍與提示
n ,m
,q
≤2000
n,m,q\le 2000
n,m,q≤
2000
。這個 「基於第 i
ii 次修改後的版本」 很能誤導人,讓人聯想可持久化資料結構。
事實上,可以把所有版本建成樹形關係,子節點是父節點的基礎上進行的修改。
此時,乙個物品會在乙個子樹內出現。在這個子樹內,如果又被更改,就會消失。所以,每個物品的出現區間是 dfn
\rm dfn
dfn 的連續區間,並且會挖掉一些 dfn
\rm dfn
dfn 區間,最終得到的還是多段區間。
究竟有多少段呢?又怎麼求呢?其實,直接把每個 「狀態更改點」 存下來(類似掃瞄線,也類似括號匹配)就可以找到出現的區間了。狀態更改點一共 4(q
−1
)4(q-1)
4(q−1)
個(更改帶來了一組消除和一組加入)。
然後揹包問題怎麼做?線段樹分治即可。複雜度 o[(
n+
qlogq
)m
]\mathcal o[(n+q\log q)m]
o[(n+q
logq)m
] 。
揹包問題(可拆揹包)
揹包問題 可拆揹包 已知n種物品和乙個可容納c重量的揹包,物品i的重量用陣列w i 來表示,產生的效益用p i 來表示裝包物品可拆,即可裝每種物品的一部分。顯然物品i的一部分x i 放入揹包中的重量為x i w i 可產生的效益為x i p i 0 define n 100 int main c,c...
動態規劃揹包問題 01揹包
問題描述 n種物品,每種乙個。第i種物品的體積為vi,重量為wi。選一些物品裝到容量為c的揹包,使得揹包內物品不超過c的前提下,重量最大。問題分析 宣告乙個f n c 的陣列。f i j 表示把前i件物品都裝到容量為j的揹包所獲得的最大重量。當 j v i 時,揹包容量不足以放下第 i 件物品,f ...
動態規劃揹包問題 完全揹包
問題描述 有n種物品,每種均有無窮多個。第i個物品的體積為vi,重量為wi。選一些物品裝到容量為c的揹包中,使得揹包內物品在總體積不超過c的前提下重量盡量大。問題分析 開乙個陣列f i j 表示前i種物品中選取若干件物品放入剩餘空間為j的揹包中所能得到的最大重量。每種物品無窮個,所以還要有乙個k遍歷...