多重揹包的理解請建立在01揹包與完全揹包的基礎上,在了解01揹包與完全揹包後,多重揹包即可不攻自破。
01揹包:
完全揹包:
多重揹包:
混合揹包:
二維成本即一種物品需要支付兩種成本,前四講中,所有物品僅有乙個重量成本,放在容量為v的揹包當中,而在二維成本揹包中,則多了乙個約束。
具體描述:有n種物品,其中第i件物品的重量為w[i],體積為v[i],使用n[i]表示第i件物品的總數量,現有乙個重量容量為wv,體積容量為vv的揹包,求在兩個指標均不超標的情況下,所能存放物品的最大價值。
充分理解單維成本揹包之後,再去理解二維成本的揹包也非難事,在前四講中,使用f[i][v]表示從前i種商品中選取一定數量放在容量為v的揹包中所能存放的最大價值,而在二維成本揹包中,在使用f[i][v]不足以表示題目要求了,需要使用f[i][wv][vv]表示從前i種商品中選取一定數量放在重量容量為wv,體積容量為vv的揹包中所能存放的最大價值。考慮第i種物品的訪問問題,使用f[i][wv - w[i] * n][vv - v[i] * n] + p[i] * n表示第i種物品取了幾件(n可為0,0 <= n <= 最大使用量), 該表示式一共可以表示(最大使用量 + 1)種狀態,而f[i][v]的值必然是這些狀態中的最大值。
首先,定義遞迴出口,當判斷到最後一種物品時,可用最後一種物品對揹包進行填充,當物品使用完或者揹包某一容量指標的剩餘容量不足以存放一件該商品時結束填充。
使用陣列存每一步迭代過程中的(最大使用量 + 1)種狀態,定義函式,返回該陣列最大值。
public
class page5 ;//重量
private
static
int v = ;//體積
private
static
int p = ;//價值
private
static
int n = ;//數量
private
static
int wv = 6;
private
static
int vv = 4;
public
static
void
main(string args)
}system.out.println(fun(p.length - 1, wv, vv));
}private
static
intfun(int i, int v1, int v2)else
return max(a);}}
private
static
intmin(int a, int b, int c)
public
static
intmax(int a)
for(int i = 0; i < a.length; i++)
}return a[index];
}}
1.二維成本揹包以及多為成本揹包中,總體最大使用量為通過各維度求得的最大使用中的最小值,將數量陣列n中大於總體最大使用量的元素置為總體的最大使用量,可有效減少迭代次數;2.在迭代過程中,當某一維度的剩餘空間小於所有物品在該維度的最小值時可以結束遞迴。
以上為我個人二維成本揹包的簡單理解,如有不到之處,歡迎指正。
未完待續。。。
揹包九講之二維費用的揹包問題
有 n 件物品和乙個容量是 v 的揹包,揹包能承受的最大重量是 m。每件物品只能用一次。體積是 vi,重量是 mi,價值是 wi。求解將哪些物品裝入揹包,可使物品總體積不超過揹包容量,總重量不超過揹包可承受的最大重量,且價值總和最大。輸出最大價值。輸入格式 第一行兩個整數,n,v,m,用空格隔開,分...
二維費用揹包問題(揹包九講)
前言 對於一些揹包問題,重點還是在於如何找出 揹包容量 和 各種代價 以及價值,如此問題便迎刃而解了。下午 打籃球居然下冰雹了,悲催了。問題 二維費用的揹包問題是指 對於每件物品,具有兩種不同的費用 選擇這件物品必須同時付出這兩種代價 對於每種代價都有 乙個可付出的最大值 揹包容量 問怎樣選擇物品可...
揹包九講 之 01揹包及二維揹包
有 n 件物品和乙個容量是 v 的揹包。每件物品只能使用一次。第 i 件物品的體積是 vi,價值是 wi。求解將哪些物品裝入揹包,可使這些物品的總體積不超過揹包容量,且總價值最大。輸出最大價值。輸入格式 第一行兩個整數,n,v,用空格隔開,分別表示物品數量和揹包容積。接下來有 n 行,每行兩個整數 ...