物品編號 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...