容量
m kg
的揹包,另外有
i個物品,重量分別為
w[1] w[2] ... w[i]
(kg),
價值分別為
p[1] p[2] ... p[i]
(元),
將哪些物品放入揹包可以使得揹包的總價值最大?最大價值是多少?
我們要求得
i個物體放入容量為
m(kg)
的揹包的最大價值(記為 c[i
,m])。在選擇物品的時候,對於每種物品
i只有兩種選擇,即裝入揹包或不裝入揹包。某種物品不能裝入多次(可以認為每種物品只有乙個),因此該問題被稱為
0-1揹包問題 對於
c[i,m]
有下面幾種情況: a
、c[i,0]=c[0,m]=0
物品數量為
0,揹包容量為9
b、c[i,m
]=c[i-1,m] w[
i]>m
(最後乙個物品的重量大於容量,直接捨棄不用) w[
i]<=m
的時候有兩種情況,一種是放入
i,一種是不放入i
不放入i
c[i,m
]=c[i-1,m] 放入
ic[i,m]=c[i-1,m-w[
i]]+p[i]
c[i,m]=max(
不放入i
,放入i
)
物品重量大於揹包質量
class program
;int p = ;
console.writeline(updown(10, 3, w, p));
console.writeline(updown(3, 3, w, p));
console.writeline(updown(4, 3, w, p));
console.writeline(updown(5, 3, w, p));
console.writeline(updown(7, 3, w, p));
console.readkey();
}//m是揹包容量
//i是物品個數
//w 物品的重量的陣列
//p 物品價值的陣列
public static int updown(int m, int i, int w, int p)//返回值是m可以儲存的最大價值
if (w[i] > m)
else
else
return result[m, i];}}
}
class program
;int p = ;
console.writeline(bottomup(10, 3, w, p));
console.writeline(bottomup(3, 3, w, p));
console.writeline(bottomup(4, 3, w, p));
console.writeline(bottomup(5, 3, w, p));
console.writeline(bottomup(7, 3, w, p));
console.readkey();
}public static int[,] result = new int[11, 4];
public static int bottomup(int m, int i, int w, int p)
else
else}}
}return result[m, i];
}}
動態規劃4 多重揹包
1.這裡區別一下三種揹包 1 01揹包 揹包有最大容量c,給出n種物品,每種物品僅僅乙個,有自己的重量和價值wi和vi,求揹包可裝下的最大價值 2 完全揹包 揹包有最大容量c,給出n種物品,每種物品無限個,有自己的重量和價值wi和vi,求揹包可裝下的最大價值 3 多重揹包 揹包有最大容量c,給出n種...
動態規劃4揹包問題
貪心演算法。1 先放入價值最大的。這個肯定不行 2 放入平均價值最大的,也不行 二維陣列作為記憶化搜尋 第一行,只有0這個物品的時候,對應容量的最大值 第二行,考慮0和1兩件物品的時候 第三行,0,1,2都考慮 1,2 這個點 對1考慮放入1,對0考慮容量為0的時候,對應的大小。兩個加起來和6比較 ...
動態規劃 揹包
揹包經典問題 揹包問題01 乙個揹包容積為t 0 t 2000 現在有n 0 如下 includeusing namespace std int s 1005 bool f 3000 int main 揹包問題02 若每種物品有無限多個。從這n種物品中選取若干個裝入揹包內,使揹包所剩的空間最小。請求...