動態規劃揹包問題(例題)

2021-10-02 21:42:46 字數 1294 閱讀 7020

物品編號 1 2 3 4

物品體積 2 3 4 5

物品價值 3 4 5 6

求容積為8的揹包能裝的最大價值為多少?

動態規劃解題步驟

1)確定狀態

注意: 動態規劃一般要開陣列,首先要明確陣列的每個元素所代表的意義。

確定狀態需要兩個意識:(1)最後一步(2)子問題。

2)轉移方程的確定

3)初始化條件和邊界情況

注意:初始狀態大部分都是為零,用轉移方程算不出來的才需要手動定義狀態。

4)計算順序

注意:一般的計算順序是從小到大,從上到下從左到右(二維)。

本題的狀態轉移方程很容易就可以得出來是f[i][j]=max(f[i-1][j], f[i-1][j-vol[i]]+val[i])

這裡有兩個方面需要考慮,第乙個是你準備將第i件物品放入,第二是你不準備放入。所以你首先需要比較體積大小,然後比較物品價值。f[i-1][j]是你沒有放入物品時的情況,f[i-1][j-vol[i]]+val[i]是你要放入物品時,計算當前物品和剩餘空間價值的和。然後求他們的最大值max。

本題還提供了back(),是求解到底去了哪幾件物品,是揹包問題的回溯。

#include

#include

#include

#include

#include

#include

using

namespace std;

int val=

;int vol=

;int f[5]

[9];

bool flag[5]

=;//揹包的容積為8

//物品編號1,2,3,4

//物品容積2,3,4,5

//物品體積3,4,5,6

intmaxvalue()

else}}

}}intback

(int i,

int j)}if

(f[i]

[j]==f[i-1]

[j])

else

if(f[i]

[j]==f[i-1]

[j-vol[i]

]+val[i])}

intmain()

cout<}back(4

,8);

return0;

}

C 動態規劃 揹包類例題

已知有一堆西瓜,請幫忙將這一堆西瓜分成兩堆,已知每個西瓜的重量,現在要求分成兩堆的西瓜的重量的差最小 第一行輸入西瓜數量n 1 n 20 第二行有n個數,w1,wn 1 wi 10000 分別代表每個西瓜的重量 輸出分成兩堆後的質量差 5 5 8 13 27 14 3 此題好想的方法是 可以轉化為0...

動態規劃 揹包問題

給定n個物品,重量是,價值是,包的容量 承重 是w 問,放入哪些物品能使得包內價值最大 1 需要將問題轉化為子問題,通過遞迴實現,且子問題必然與父問題存在關聯 2 定義v i,j 表示為,當item取自前i個items且揹包capacity j 時,揹包問題的最優解,也即最高的價值。3 從前i個it...

動態規劃 揹包問題

不廢話,直接上 動態規劃,揹包問題。輸入為 int n 物品的種類數。int n weight 各件物品的重量。int n value 各種物品的價值。int w 揹包最大的裝載重量。輸出 v n b 的值,最大的裝載價值。x n 各類物品的裝載數量。author huangyongye publi...