完全揹包問題

2021-08-24 20:17:34 字數 1902 閱讀 4390

有n種物品和乙個容量為v的揹包,每種物品都有無限件可用。第i種物品的費用是c[i],價值是w[i]。求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。

這個問題非常類似於01揹包問題,所不同的是每種物品有無限件。也就是從每種物品的角度考慮,與它相關的策略已並非取或不取兩種,而是有取0件、取1件、取2件……等很多種。如果仍然按照解01揹包時的思路,令f[i][v]表示前i種物品恰放入乙個容量為v的揹包的最大權值。仍然可以按照每種物品不同的策略寫出狀態轉移方程,像這樣:

f[i][v]=max

這跟01揹包問題一樣有o(vn)個狀態需要求解,但求解每個狀態的時間已經不是常數了,求解狀態f[i][v]的時間是o(v/c[i]),總的複雜度可以認為是o(v*σ(v/c[i])),是比較大的。

將01揹包問題的基本思路加以改進,得到了這樣乙個清晰的方法。這說明01揹包問題的方程的確是很重要,可以推及其它型別的揹包問題。但我們還是試圖改進這個複雜度。

完全揹包問題有乙個很簡單有效的優化,是這樣的:若兩件物品i、j滿足c[i]=w[j],則將物品j去掉,不用考慮。這個優化的正確性顯然:任何情況下都可將價值小費用高得j換成物美價廉的i,得到至少不會更差的方案。對於隨機生成的資料,這個方法往往會大大減少物品的件數,從而加快速度。然而這個並不能改善最壞情況的複雜度,因為有可能特別設計的資料可以一件物品也去不掉。

考慮到第i種物品最多選v/c[i]件,於是可以把第i種物品轉化為v/c[i]件費用及價值均不變的物品,然後求解這個01揹包問題。這樣完全沒有改進基本思路的時間複雜度,但這畢竟給了我們將完全揹包問題轉化為01揹包問題的思路:將一種物品拆成多件物品

更高效的轉化方法是:把第i種物品拆成費用為c[i]*2^k、價值為w[i]*2^k的若干件物品,其中k滿足c[i]*2^k<=v。這是二進位制的思想,因為不管最優策略選幾件第i種物品,總可以表示成若干個2^k件物品的和。這樣把每種物品拆成o(log v/c[i])件物品,是乙個很大的改進。

這個演算法使用一維陣列,先看偽**:

for i=1..n

for v=cost..v

f[v]=max

你會發現,這個偽**與p01的偽**只有v的迴圈次序不同而已。

舉例來說:

有三種面值的優惠券:30,50,100,分別有任意個數。現在給定乙個金額v,求最大可以優惠的金額是多少。

抽象來說,這個問題可以用完全揹包問題來解決。完全揹包問題可以看做是:

有3種物品和乙個為v的揹包,這三種物品的重量分別為,價值也可以看做分別對應是

因此,可以寫出演算法複雜度為o(vn)的**如下:

public

class soution1

//一維陣列解決

public

static

void

getmaxvalue(bao baos,int num,int all)

}system.out.println(f[all]);

}}//v=110,輸出110

//v=70,輸出60

//v=120,輸出120

//v=20,輸出0

和01揹包的區別,這裡的內迴圈是順序的,而01揹包是逆序的。

現在關鍵的是考慮:為何完全揹包可以這麼寫?

在次我們先來回憶下,01揹包逆序的原因?是為了是max中的兩項是前一狀態值,這就對了。

那麼這裡,我們順序寫,這裡的max中的兩項當然就是當前狀態的值了,為何?

因為每種揹包都是無限的。當我們把i從1到n迴圈時,f[v]表示容量為v在前i種揹包時所得的價值,這裡我們要新增的不是前乙個揹包,而是當前揹包。所以我們要考慮的當然是當前狀態。

對於二維陣列,更新的時候為res[i][j-w[k]]

揹包問題(完全揹包)

1.矩陣鏈乘法 2.投資組合問題 3.完全揹包問題 4.01揹包問題 5.最長公共子串行 乙個揹包,可以放入n種物品,物品j的重量和價值分別為,如果揹包的最大重量限制是b,怎麼樣選擇放入揹包的物品以使得揹包的總價值最大?組合優化問題,設表示裝入揹包的第j個物品的數量,解可以表示為。那麼目標函式和約束...

完全揹包問題

這個是從ppt上弄過來的。完全揹包問題 有n種物品和乙個容量為v的揹包,每種物品都有無限件可用。放入第i種物品的耗費的空間是ci,得到的價值是wi。求解 將哪些物品裝入揹包,可使這些物品的耗費的空間總和不超過揹包容量,且價值總和最大 基本思路 這個問題非常類似於01揹包問題,所不同的是每種物品有無限...

完全揹包問題

設有n種物品,每種物品有乙個重量及乙個價值。但每種物品的數量是無限的,同時有乙個揹包,最大載重量為m,今從n種物品中選取若干件 用乙個物品可以多次選取 使其重量的和小於等於m,而價值的和為最大。輸入有多組資料,對於每組輸入資料第1行 兩個整數,m 揹包容量,m 200 和n 物品數量,n 30 第2...