分組揹包的理解請建立前幾講的基礎上。
01揹包:
完全揹包:
多重揹包:
混合揹包:
二維揹包:
有n件物品,分為若干組,現約束,在每組物品裡最多取一件物品放入揹包,每件物品的重量確定,價值確定,揹包容量確定,求在不超過揹包容量的情況下,可以存放的最大價值。
首先判斷乙個分組當中的一件物品,同01揹包一樣,此物品存在兩種狀態,取與不取,若取此物品,則繼續判斷下一組的第一件物品,若不取此物品,則繼續判斷本組下一件物品,若該物品為本組最後一件物品,則判斷下一組。
使用w[g][i]表示第g組第i件商品的重量,使用p[g][i]表示第g組第i件商品的價值。使用f[g][i][v]表示,從前n組中選取部分商品放入容量為v的揹包,所能獲取的最大價值。則f[g][i][v] = max(f[g][i - 1][v], f[g - 1][n][v- w[g][i]] + p[g][i],f[g - 1][n][v]).
public
class page6 , , };//重量
private
static
int p = , , };//價值
private
static
int v = 10;
public
static
void
main(string args)
private
static
intfun(int g, int i, int v)else
}elseelse
if(i == 0)else
}elseelse}}
}public
static
intmax(int a, int b, int c)
private
static
intmax(int a, int b)
}
1.當揹包剩餘容量小於正在判斷的組內物品中重量最小的物品的重量時,停止判斷該組,直接判斷下一組;2.當揹包剩餘容量小於剩餘物品中重量最小的物品的重量時,結束遞迴;3.組內同重量低價值的物品刪除後不影響最終結果;
以上為我個人對分組揹包的簡單理解,如有不到之處,歡迎指正。
未完待續。。。
DP 揹包九講之分組揹包
有 n 組物品和乙個容量是 v 的揹包。每組物品有若干個,同一組內的物品最多只能選乙個。每件物品的體積是 vij,價值是 wij,其中 i 是組號,j 是組內編號。求解將哪些物品裝入揹包,可使物品總體積不超過揹包容量,且總價值最大。輸出最大價值。輸入格式 第一行有兩個整數 n,v,用空格隔開,分別表...
通天之分組揹包 分組揹包
本人水平有限,題解不到為處,請多多諒解 本蒟蒻謝謝大家 題目 傳送門 分組揹包的模板 偽 1 for int i 1 i 組數 i 6 7 直接套模板即可。code 1 include2 pragma gcc optimize 3 3const int n 1e5 10 4 using namesp...
揹包九講 01揹包問題
1 01揹包問題描述 已知 有 n 件物品和乙個容量為 v 的揹包。第i件物品的重量為w i 得到的價值是 c i 問題 求解將哪些物品裝入揹包可使價值總和最大。條件 每種物品只有一件,可以選擇放或者不放 2 基本思路 01揹包的特點 每種物品只有一件,可以選擇放或者不放 子問題定義狀態f i v ...