01揹包 二進位制拆分

2021-08-15 01:37:35 字數 806 閱讀 8402

二進位制拆分原理:任何乙個整數都可以轉換成乙個若干個2k

2

k數相加的形式(因為可以轉化成二進位制數)。

k個物品,我們可以選擇的是取 0~e 件,代價和大小分別是取的件數 p,p*ti 和 p*ci。假設我們取 p 件得到的就是最優解,當我們把 e 件物品變成若干件,,,……,,其中2k

2

k≤k且2k

+12 k+

1>e。這若干件物品可以想象成把好幾件物品 i **在一起,而且通過這若干件物品肯定能組合出和取 p 件物品 i 等價的情況。

因為 p 也可以拆成若干2k

2

k數相加的形式,就是我們拆分出來的。很明顯,每個2k

2

k數,拆出乙個就夠了。之後為什麼多了乙個不是2k

2

k的數呢?因為 k 不一定剛好被分完。如果∑k

i=12

i ∑i=

1k2i

還小於 e 怎麼辦(比如 e=5)?這就是為什麼我們把它們的差值作為乙個新物品!這樣使得總和正好為 e,同時可以真正組合出0 到 p 每個數字。

此時每件**後的物品最多只能取一次,所以物品 i 的複雜度應該是lo

gk2×

allv

l og

2k×a

ll

v(allv表示揹包總空間,實際比這個小一些),n 件物品的複雜度為這個的 n 倍,原複雜度(假設都是 k 件)應為n×

k×al

lvn ×k

×all

v,顯然時間已經被優化了。

多重揹包(二進位制拆分優化)

多重揹包基本模型如下 給定n種物品,其中第i種物品的體積為vi,價值為wi,並且有ci個。有一容積為m的揹包,要求選擇若干個物品放入揹包,使得物品總體積不超過m的前提下,物品價值總和最大。輸入格式 第一行兩個整數,n,m,用空格隔開,分別表示物品種數和揹包容積。接下來有 n 行,每行三個整數 vi,...

01揹包問題(二進位制解法)

題目有n件物品和乙個容量為v的揹包。第i件物品的重量是w i 求解將哪些物品裝入揹包可使這些物品的重量總和不超過揹包容量的最大重量。首先,我想分析一下這個題目大暴力時,複雜度為什麼為n 2。如果大暴力,本題目的預算次數實際為pow 2,n 1。初等數學思路 大佬請忽略 本題中一共給定n個物品,如果要...

多重揹包的二進位制拆分法

在多重揹包的直接拆分法中,個數為 c i 的物體被拆成 c i 種不同的物體 這樣就使得物體的種類增加了很多,使得演算法效率很低。上述方法把 c i 拆成 c i 個1,於是任意選擇可以表示出 1 到 c i 之間的所有數,從而達到多重揹包的目的 想到,從 2 0,2 1,2 2,2 k 任意選擇可...