考慮這樣一種物品,它並沒有固定的費用和價值,而是它的價值隨著你分配給它的費用而變化。這就是泛化物品的概念。
更嚴格的定義之。在揹包容量為v的揹包問題中,泛化物品是乙個定義域為0..v中的整數的函式h,當分配給它的費用為v時,能得到的價值就是h(v)。
這個定義有一點點抽象,另一種理解是乙個泛化物品就是乙個陣列h[0..v],給它費用v,可得到價值h[v]。
乙個費用為c價值為w的物品,如果它是01揹包中的物品,那麼把它看成泛化物品,它就是除了h(c)=w其它函式值都為0的乙個函式。如果它是完全揹包中的物品,那麼它可以看成這樣乙個函式,僅當v被c整除時有h(v)=v/cw,其它函式值均為0。如果它是多重揹包中重複次數最多為n的物品,那麼它對應的泛化物品的函式有h(v)=v/cw僅當v被c整除且v/c<=n,其它情況函式值均為0。
乙個物品組可以看作乙個泛化物品h。對於乙個0..v中的v,若物品組中不存在費用為v的的物品,則h(v)=0,否則h(v)為所有費用為v的物品的最大價值。有依賴的揹包問題中每個主件及其附件集合等價於乙個物品組,自然也可看作乙個泛化物品。
如果面對兩個泛化物品h和l,要用給定的費用從這兩個泛化物品中得到最大的價值,怎麼求呢?事實上,對於乙個給定的費用v,只需列舉將這個費用如何分配給兩個泛化物品就可以了。同樣的,對於0..v的每乙個整數v,可以求得費用v分配到h和l中的最大價值f(v)。也即
f(v)=max
可以看到,f也是乙個由泛化物品h和l決定的定義域為0..v的函式,也就是說,f是乙個由泛化物品h和l決定的泛化物品。
由此可以定義泛化物品的和:h、l都是泛化物品,若泛化物品f滿足以上關係式,則稱f是h與l的和。這個運算的時間複雜度取決於揹包的容量,是o(v^2)。
泛化物品的定義表明:在乙個揹包問題中,若將兩個泛化物品代以它們的和,不影響問題的答案。事實上,對於其中的物品都是泛化物品的揹包問題,求它的答案的過程也就是求所有這些泛化物品之和的過程。設此和為s,則答案就是s[0..v]中的最大值。
乙個揹包問題中,可能會給出很多條件,包括每種物品的費用、價值等屬性,物品之間的分組、依賴等關係等。但肯定能將問題對應於某個泛化物品。也就是說,給定了所有條件以後,就可以對每個非負整數v求得:若揹包容量為v,將物品裝入揹包可得到的最大價值是多少,這可以認為是定義在非負整數集上的一件泛化物品。這個泛化物品——或者說問題所對應的乙個定義域為非負整數的函式——包含了關於問題本身的高度濃縮的資訊。一般而言,求得這個泛化物品的乙個子域(例如0..v)的值之後,就可以根據這個函式的取值得到揹包問題的最終答案。
綜上所述,一般而言,求解揹包問題,即求解這個問題所對應的乙個函式,即該問題的泛化物品。而求解某個泛化物品的一種方法就是將它表示為若干泛化物品的和然後求之。
本講可以說都是我自己的原創思想。具體來說,是我在學習函式式程式設計的 scheme 語言時,用函式程式設計的眼光審視各類揹包問題得出的理論。這一講真的很抽象,也許在「模型的抽象程度」這一方面已經超出了noip的要求,所以暫且看不懂也沒關係。相信隨著你的oi之路逐漸延伸,有一天你會理解的。
揹包九講 簡單揹包
揹包問題是一種動態規劃演算法的衍生問題。它可以被看作一種獨立的題型,也可以看作是一種線性動態規劃。學好揹包 學會揹包,對於深入理解動態規劃演算法有著極大的好處,並能幫助理解一些更深層次的動態規劃問題。那麼就開始吧 題目型別 有 n 件物品和乙個容量為 v 的揹包。第 i 件物品的費體積是 v i 價...
P1417 烹調方案 泛化物品揹包
由於你的幫助,火星只遭受了最小的損失。但gw懶得重建家園了,就造了一艘飛船飛向遙遠的earth星。不過飛船飛到一半,gw發現了乙個很嚴重的問題 肚子餓了 gw還是會做飯的,於是拿出了儲藏的食物準備填飽肚子。gw希望能在t時間內做出最美味的食物,但是這些食物美味程度的計算方式比較奇葩,於是絕望的gw只...
演算法 揹包九講
例題參考 資訊學奧賽一本通 初始化分兩種情況 1 如果揹包要求正好裝滿則初始化 f 0 0,f 1 v inf 2 如果不需要正好裝滿 f 0 v 0 有n件物品和乙個容量為v的揹包。第i件物品的費用 即體積,下同 是w i 價值是c i 求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,...