第一道題:
這道題就是一道非常的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 ...