演算法設計 0 1揹包問題(動態規劃)

2021-10-05 02:42:28 字數 1258 閱讀 8423

給定n種物品和一揹包

wi :物品i的重量

vi :物品i的重量價值

c:揹包的容量

問:應如何選擇裝入揹包的物品, 使得裝入揹包中物品的總價值最大?

p[i][j]代表可選擇物品為前i個,揹包容量為j時的最大價值

當j=w[i]時我們需要判斷v[i]+p[i-1][j-w[i]]與p[i-1][j]的大小來對p[i][j]進行賦值

為什麼是判斷v[i]+p[i-1][j-w[i]]與p[i-1][j]呢

當j>w[i]時,我們可以裝入i,價值為v[i],此時容量為j-w[i],且物品到了第i-1個物品,所以p[i][j]可以為v[i]+p[i-1][j-w[i]]

同樣,我們也可以不裝入此物品,那麼此時去掉這個物品並沒有影響,就有p[i][j]=p[i-1][j]

由於p[i][j]代表揹包容量為j時的最大價值,所以需要比較兩種情況的最大值,並填入p[i][j]

用陣列s[i][j]記錄在容量為j的情況下是否選擇第i個物品

//p為最大價值,s為選擇與否

void

print

(int n,

int m,

int s[

][n]

)else

}int

main()

printf

("請輸入各物品的價值:");

for(i=

1;i<=n;i++

)for

(i=0

;i<=n;i++

)for

(i=0

;i<=m;i++

)for

(i=1

;i<=n;i++

)else

else}}

}printf

("最大價值為:%d\n選擇的物品為:"

,p[n]

[m])

;print

(n,m,s)

;return0;

}

演算法 動態規劃0 1揹包問題

有乙個容量為 n 的揹包,要用這個揹包裝下物品的價值最大,這些物品有兩個屬性 體積 w 和價值 v。定義乙個二維陣列 dp 儲存最大價值,其中 dp i j 表示前 i 件物品體積不超過 j 的情況下能達到的最大價值。設第 i 件物品體積為 w,價值為 v,根據第 i 件物品是否新增到揹包中,可以分...

動態規劃揹包問題 01揹包

問題描述 n種物品,每種乙個。第i種物品的體積為vi,重量為wi。選一些物品裝到容量為c的揹包,使得揹包內物品不超過c的前提下,重量最大。問題分析 宣告乙個f n c 的陣列。f i j 表示把前i件物品都裝到容量為j的揹包所獲得的最大重量。當 j v i 時,揹包容量不足以放下第 i 件物品,f ...

動態規劃 揹包問題 01揹包

有n種物品和乙個容量為v的揹包,每種物品僅用一次。第i件物品的費用是w i 價值是v i 求解將哪些物品裝入揹包可使價值總和最大。例如 n 5,v 10 重量 價值 第乙個物品 10 5 第二個物品 1 4 第三個物品 2 3 第四個物品 3 2 第五個物品 4 1 首先我們考慮貪心策略,選取最大價...