揹包問題精講2018 08 09

2021-08-22 13:40:52 字數 1578 閱讀 1175

第一道題:

這道題就是一道非常的01揹包模板,不過需要注意到題目的條件還需要乘上重要性,也就是價值=原價值*重要度,其他的就按照01揹包模板照打即可。

附上**吧:

#include

using

namespace std;

const

int maxn=

100000+20

;int a[maxn]

,w[maxn]

,v[maxn]

,f[maxn]

;int

main()

for(

int i=

1;i<=n;i++

)for

(int j=m;j>=v[i]

;j--

) f[j]

=max

(f[j]

,f[j-v[i]

]+w[i]);

cout<;return0;

}

第二道題:

這一道題比上一道題難度明顯增加了許多,而且,這道題的揹包有依賴性了,也就是以來揹包,思路:

價值=原價值*重要度不變,但後面多了個附件的條件,也就是說,每乙個主件都最多可以擁有2個附件,則輸入時需要優先儲存每乙個附件的歸屬情況,這裡我用二位陣列儲存,那麼,讀入的**就是這樣的:

//q1是第乙個附件的儲存情況,q2是第二個附件的儲存情況,v是價值,p是重要度,q是是否為附件,若是,又為誰的附件。

cin>>n>>m;

for(

int i=

1;i<=m;i++

)else

}

接下來,在dp的迴圈裡面,我們也需要考慮幾種情況:

1.若是第乙個附件

2.若是第二個附件

3.如果即是第乙個附件又是第二個附件

所以,附上重要部分的**:

for

(int i=

1;i<=m;i++

)for

(int j=n;j>=w[i]

;j--

)

最後,附上完整**:

#include

const

int maxn=

1000+50

;using

namespace std;

int n,m,f[maxn]

,v[maxn]

,p[maxn]

,q[maxn]

,w[maxn]

,c[maxn]

,q1[maxn]

[maxn]

,q2[maxn]

[maxn]

;int

main()

else

}for

(int i=

1;i<=m;i++

)for

(int j=n;j>=w[i]

;j--

) cout<;return0;

}

01揹包精講

給定乙個物品集合s 物品i具有重量wi和價值vi。揹包能承受能承受的最大載重量不超過w。揹包問題就是找到乙個物品子集s 屬於s,使得maxewi w。所謂01揹包就是物品要麼整個地選取,要麼不取。首先我們先要肯定一件事,假設子問題 i,w 的最優裝載中含有物品i,則其中的子問題 i 1,w wi 的...

揹包精講之 01揹包

了解01揹包時應該注意01揹包在問法上的差別 初始化分兩種情況 1 如果揹包要求正好裝滿則初始化 f 0 0,f 1 w inf 2 如果不需要正好裝滿 f 0 v 0 題目 有n 件物品和乙個容量為 v的揹包。第 i件物品的費用是 c i 價值是 w i 求解將哪些物品裝入揹包可使價值總和最大。整...

揹包九講 01揹包問題

1 01揹包問題描述 已知 有 n 件物品和乙個容量為 v 的揹包。第i件物品的重量為w i 得到的價值是 c i 問題 求解將哪些物品裝入揹包可使價值總和最大。條件 每種物品只有一件,可以選擇放或者不放 2 基本思路 01揹包的特點 每種物品只有一件,可以選擇放或者不放 子問題定義狀態f i v ...