可持久化動態揹包問題

2021-10-19 19:23:31 字數 993 閱讀 5069

題目描述

有 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+

qlog⁡q

)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遍歷...