問題:
有n件物品,告訴你這n件物品的重量以及價值,將這些物品劃分為k組,每組中的物品互相衝突,最多選一件,求解將哪些物品裝入揹包可使這些物品的費用綜合不超過揹包的容量,且價值總和最大。
演算法:首先判斷乙個分組當中的一件物品,同01揹包一樣,此物品存在兩種狀態,取與不取,若取此物品,則繼續判斷下一組的第一件物品,若不取此物品,則繼續判斷本組下一件物品,若該物品為本組最後一件物品,則判斷下一組。也就是說設f[k][v]表示前k組物品花費費用v能取得的最大權值,則有:f[k][v]=max。使用一維陣列的偽**如下:
for 所有的組k
for v=v..0
for 所有的i屬於組k
f[v]=max
分組的揹包問題將彼此互斥的若干物品稱為乙個組,這建立了乙個很好的模型。不少揹包問題的變形都可以轉化為分組的揹包問題由分組的揹包問題進一步可定義「泛化物品」的概念,十分有利於解題。例題:hdu1712
例題:乙個旅行者有乙個最多能用v公斤的揹包,現在有n件物品,它們的重量分別是w1,w2,...,wn,它們的價值分別為c1,c2,...,cn。這些物品被劃分為若干組,每組中的物品互相衝突,最多選一件。求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。
【輸入格式】
第一行:三個整數,v(揹包容量,v<=200),n(物品數量,n<=30)和t(最大組號,t<=10);
第2..n+1行:每行三個整數wi,ci,p,表示每個物品的重量,價值,所屬組號。
【輸出格式】
僅一行,乙個數,表示最大總價值。
sample in:
10 6 3
2 1 1
3 3 1
4 8 2
6 9 2
2 8 3
3 9 3
sample out:
**示例 :
int dp[205];
int v, n, t;
int we[35], c[35];
vectorve[35];
int main()
for(int i = 1; i <= t; i++)}}
printf("%d\n", dp[v]);
return 0;}/*
10 6 3
2 1 1
3 3 1
4 8 2
6 9 2
2 8 3
3 9 3
*/
分組揹包(動態規劃)
description 有n件物品和乙個容量為v的揹包。第i件物品的費用是c i 價值是w i 這些物品被劃分為若干組,每組中的物品互相衝突,最多選一件。求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。input 第一行 三個整數,v 揹包容量,v 200 n 物品數量,...
動態規劃 揹包
揹包經典問題 揹包問題01 乙個揹包容積為t 0 t 2000 現在有n 0 如下 includeusing namespace std int s 1005 bool f 3000 int main 揹包問題02 若每種物品有無限多個。從這n種物品中選取若干個裝入揹包內,使揹包所剩的空間最小。請求...
揹包(動態規劃)
一 01揹包問題 特點 每件物品僅有一件,可以選擇放與不放 有件物品和乙個容量為 的揹包。第 件物品的費用是 價值是 求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。用子問題定義狀態 f i v max f i 1 v f i 1 v c i w i 注意有意義當且僅當存...