演算法 4 動態規劃揹包

2021-10-12 08:29:05 字數 1794 閱讀 8751

容量

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種物品中選取若干個裝入揹包內,使揹包所剩的空間最小。請求...