1樓:匿名使用者
初看這類問題,第一個想到的會是貪心,但是貪心法卻無法保證一定能得到最優解,看以下例項:
貪心準則1:從剩餘的物品中,選出可以裝入揹包的價值最大的物品,利用這種規則,價值最大的物品首先被裝入(假設有足夠容量),然後是下一個價值最大的物品,如此繼續下去。這種策略不能保證得到最優解。
例如,考慮n=2, w=[100,10,10], p =[20,15,15], c =105。當利用價值貪婪準則時,獲得的解為x= [1,0,0],這種方案的總價值為20。而最優解為[0,1,1],其總價值為30。
貪心準則2:從剩下的物品中選擇可裝入揹包的重量最小的物品。雖然這種規則對於前面的例子能產生最優解,但在一般情況下則不一定能得到最優解。
考慮n= 2 ,w=[10,20], p=[5,100], c= 2 5。當利用重量貪婪策略時,獲得的解為x =[1,0], 比最優解[ 0 , 1 ]要差。
貪心準則3:價值密度pi /wi 貪婪演算法,這種選擇準則為:從剩餘物品中選擇可 裝入包的pi /wi 值最大的物品,但是這種策略也不能保證得到最優解。
利用此策略解 n=3 ,w=[20,15,15], p=[40,25,25], c=30 時的得到的就不是最優解。
由此我們知道無法使用貪心演算法來解此類問題。我們採用如下思路:
在該問題中需要決定x1 .. xn的值。假設按i = 1,2,...
,n 的次序來確定xi 的值。如果置x1 = 0,則問題轉變為相對於其餘物品(即物品2,3,.,n),揹包容量仍為c 的揹包問題。
若置x1 = 1,問題就變為關於最大揹包容量為c-w1 的問題。現設r= 為剩餘的揹包容量。在第一次決策之後,剩下的問題便是考慮揹包容量為r 時的決策。
不管x1 是0或是1,[x2 ,.,xn ] 必須是第一次決策之後的一個最優方案。也就是說在此問題中,最優決策序列由最優決策子序列組成。
假設f (i,j) 表示剩餘容量為j,剩餘物品為i,i + 1,...,n 時的最優解的值,即:利用最優序列由最優子序列構成的結論,可得到f 的遞迴式為:
當j≥wi時: f(i,j)=max
當0≤j=wi), f[i-1,j]}
這樣,就可以自底向上地得出在前n件物品中取出若干件放進揹包能獲得的最大價值,也就是f[n,c]
演算法框架如下:
for i:=0 to c do
f[0,i]:=0;
for i:=1 to n do
for j:=0 to c do
begin
f[i,j]:=f[i-1,j];
if (j>=w[i]) and (f[i-1,j-w[i]]+p[i]>f[i,j])
then f[i,j]:=f[i-1,j-w[i]]+p[i];
end;
writeln(f[n,c]);
為了進一步說明演算法的執行原理,下面給出一個例項:
【輸入檔案】104
5 1 4 3
40 10 25 30
【輸出結果】下面列出所有的f[i,j]
0 0 0 0 40 40 40 40 40 40
10 10 10 10 40 50 50 50 50 50
10 10 10 25 40 50 50 50 65 75
10 10 30 40 40 50 55 70 80 80
從以上的資料中我們可以清晰地看到每一次的列舉結果,每一行都表示一個階段。
2樓:
網上搜下,很多的,關鍵看你對此的理解!
我是小學生啦為主題的畫怎麼畫, 我是小學生啦 為題寫一篇手抄報
小丁創業 以畫娃娃為例,方法如下 1 首先,娃娃上畫出頭和辮子,如下圖所示,然後進入下一步。2 其次,完成上述步驟後,在頭髮的基礎上繪製娃娃的面部輪廓,如下圖所示,然後進入下一步。3 接著,完成上述步驟後,將娃娃的眼睛,鼻子和嘴巴畫在臉上,如下圖所示,然後進入下一步。4 然後,完成上述步驟後,將娃娃...
小學生閱讀卡怎麼做,一年級小學生讀書卡怎麼做
不懂先生 如果想做的更詳細點,可以以知識框架或思維導圖的形式來來整理書籍,主要是書本的重要內容提煉,也包括自己在讀的過程中的一些理解和感悟 如果在後期的學習或閱讀中有相關的新知識點 新體會,也都可以加進去,建立知識的連線,方便掌握和運用 對於你看了之後很有感觸的內容,可以試著寫寫讀書感悟。讀書的效率...
我是小學生,下面幾道題超綱了,請問怎麼做
1 560000,從前面 不是零的第一個數開始 數三位,從第四位開始四捨五入就行了。2 471000 3 12.9 4 20 超綱?有嗎?1 5.60 10 5.2 4.71 10 5.3 12.9千克.4 2 10秒. 560000 471000 12.920 1 560000 2 4.70600...