每日程式設計題之揹包問題

2021-09-11 14:04:57 字數 2949 閱讀 5008

先從栗子出發,你是乙個有理想的吃貨,你的肚子只能容納5kg的東西,為了保證你的營養最大化,有以下幾種食物可以選擇

食物 v\w

質量價值

0kg1kg

2kg3kg

4kg5kg

黃瓜1kg50

5131317

23西紅柿

1kg808

8121818

公尺飯2kg40

041010

14牛肉

3kg000

0101010

看不懂?容我解釋

d(i,w)代表肚子能吃w千克食物時,是否吃食物i的最大營養值(最優解)

假設1 放or不放牛肉

size(牛肉)=3kg,當揹包大小小於3kg時,牛肉都放不進去,此前揹包的總價值都為d=0(w=1kg,w=2kg),此後揹包價值為d(牛肉,w)=10(w>=3)

假設2 放or不放公尺飯

size(公尺飯)=2kg,當揹包價值小於2kg時,公尺飯是放不進去的,使d(公尺飯,w)=d(牛肉,w); ,當w>=2kg時,就要開始判斷,是放進公尺飯的價值大呢,還是不放公尺飯的價值大?

放公尺飯的價值為 d(公尺飯,w)=v[公尺飯]+d(牛肉,w-s[公尺飯])

不放公尺飯的價值為 d(公尺飯,w)=d(牛肉,w)

w=2時,d(公尺飯,2)=max(v[公尺飯])+d(牛肉,2-2),d(牛肉,2))=4

w=3時,d(公尺飯,3)=max(v[公尺飯])+d(牛肉,3-2),d(牛肉,3))=10

同理 d(公尺飯,4)=d(公尺飯,5)=10

假設3 放or不放西紅柿

size(西紅柿)=1kg,當揹包價值小於1kg時,西紅柿是放不進去的,使d(西紅柿,w)=d(公尺飯,w);放西紅柿的價值為 d(西紅柿,w)=v(西紅柿)+d(公尺飯,w-s[西紅柿])

不放西紅柿的價值為 d(西紅柿,w)=d(公尺飯,w)

w=1時,d(西紅柿,1)=max(v[西紅柿])+d(公尺飯,w-s[西紅柿]),d[公尺飯,1])=8

w=2時,d(西紅柿,2)=max(v[西紅柿])+d(公尺飯,w-s[西紅柿]),d[公尺飯,2])=8

w=3時,v(西紅柿)+d(公尺飯,w-s[西紅柿])=8+d(公尺飯,2)=12>d[公尺飯]=8,故d(西紅柿,3)=12 同理,v(西紅柿,4)=18,v(西紅柿,5)=18.

假設4 放or不放黃瓜.

size(黃瓜)=1kg,當揹包價值小於1kg時,黃瓜是放不進去的,使d(黃瓜,w)=d(西紅柿,w); 至於d的值,如圖。

每一次的肚子選擇,都是假設物品a放入了肚子,然後在放入與不放的假設中找到最優,即 全域性最優解包含區域性最優解,自頂向下尋找最優解,自底向上求最優解

咳咳,敲重點了哈,動態規劃最重要的問題是什麼?是問題中的狀態和狀態轉移方程是什麼

諾。

d(i, j)=max

即假設放入物體否吃進肚子裡,一層一層考慮。就像下表中,先從3kg的牛肉放起。

食物 v\w

質量價值

0kg1kg

2kg3kg

4kg5kg

黃瓜1kg50

5131317

23西紅柿

1kg808

8121818

公尺飯2kg40

041010

14牛肉

3kg1000

0101010

先放牛肉的寫法

for(int j = 0; j <= c; j++)

if(j < w[n]) m[n][j] = 0; //j小於w[n],所對應的值設為0,否則就為可以放置

else m[n][j] = v[n];

//對剩下的n-1個物品進行放置。

int i;

for(i = n-1; i >= 1; i--)

for(int j = 0; j <= c; j++)

if(j < w[i])

d[i][j] = d[i+1][j];//如果j < w[i]則,當前位置就不能放置,它等於上乙個位置的值。

//否則,就比較到底是放置之後的值大,還是不放置的值大,選擇其中較大者。

else d[i][j] = d[i+1][j] > d[i+1][j-w[i]] + v[i]?

d[i+1][j] : d[i+1][j-w[i]] + v[i];

} 複製**

先放黃瓜的寫法

//本例中n=4,c=5

//返回最大值

function max(a, b) //其實js有內建的math.max()

var value = [5, 8, 4, 10],

size = [1, 1, 2, 3],

d = ,

n = 4,

c = 5;

//初始化陣列

for (var k = 0; k <= n; ++k)

for (var i = 0; i <= n; ++i)

}console.log(d[n][c], d[1][1])

//乾坤大迴圈後,得出d[n][c]

複製**

揹包問題中,當時我最困惑的點是,你放了這個物品進去,怎麼確保這次放的對以後的選項來說是最好的選擇。 後來才意識到,它是考慮了所有的情況,得到最大值

動態規劃之揹包問題(一)

動態規劃之01揹包問題--**思路**

通過金礦模型介紹動態規劃

揹包問題之01揹包問題

題目 有n件物品和乙個容量為v的揹包。第i件物品的容量是c i 價值為w i 求解將哪些物品裝入揹包可以使得這些物品的費用總和不超過揹包容量,且價值總和最大。基本思路 作為最基礎的揹包問題,特點是 每種物品只有一件,可以選擇放或者是不放。用子問題定義狀態 f i v 表示前i件物品恰好放入乙個容量為...

揹包問題之01揹包

01揹包就是說針對每一件物品,有選擇裝入或者放棄,是屬於動態規劃類的問題。現在假設我們有m件物品,各有價值,揹包承重為10,假設當前可用的承重量為v,當前在抉擇第m件物品是否放入,重量為w1,價值為v1,那麼,如果不放入,我們的價值應該保持不變,並與之前算出的最大價值相同,如果放入,放入後的價值就是...

揹包問題之0 1揹包

0 1揹包是最基本的揹包問題,其核心思路就在於每個物品的放與不放 每個物品最多只能放一次 題目有 n 個物品和乙個大小為 m 的揹包.給定陣列 a 表示每個物品的大小和陣列 v 表示每個物品的價值.問最多能裝入揹包的總價值是多大?樣例輸入 m 10,a 2,3,5,7 v 1,5,2,4 輸出 9 ...