題意:
13種裝備(每種可能會有多件),每件裝備有兩個屬性:傷害,韌性。現在乙個人想裝備這些裝備,目標是達到韌性m,使得傷害最高,輸出最高傷害。如果達不到目標韌性則輸出-1.思路:有兩個條件:
根據題意,每種裝備只能裝備一件,有點像0-1揹包。0-1揹包中容量應該是m(韌性),但是這道題種要求的是需要一定大於等於m的韌性,不像0-1揹包中的容量隨意可以拆分。所以:第i種裝備是否可以挑選是建立在第i-1裝備的基礎上的。根據這種思想寫出狀態表示式。 dp
[i][
j+t]
=max
(dp[
i][j
+t],
dp[i
−1][
j]+d
)
: 表示裝備第i種裝備會增加t的韌性,和上一件裝備的狀態加上傷害d取最大值即可。
然後只需要遍歷第i種裝備的每一件即可,其呈現的效果就像bfs一樣成為一層的裝備狀態。
還有兩個條件限制:
對於「two-handed」 把它和「weapon」與「shield」當做一種商品,並且「weapon」與「shield」 的組合也放在一起。這樣挑選就不會起衝突了。
類似的:「finger」 和其組合放在一起當做一種商品,就會利用每一種商品計算的時候分層而不會衝突。dp
[i][
j]的初始化。
#include
#include
#include
#include
#include
using
namespace
std;
struct goods
;map
mp;vector
g[15];
int n,m;
int dp[15][50005];
void init()
int main()
); }
int length1 = g[1].size();
int length2 = g[2].size();
for(int j = 0;j < length2; j++)
for(int i = 0;i < length1; i++) );}}
int length3 = g[4].size();
for(int i = 0;i < length3; i++) );}}
memset(dp,-1,sizeof(dp));
dp[2][0] = 0;
for(int i = 3;i <= 13; i++) }}
cout
<13][m]0;}
ZOJ 3769 Diablo III(分組揹包)
題意 有13種裝備,每種裝備值可以穿戴一種,特殊的就是雙手 和單手 雙手 和單手 盾只能選擇一種,戒指可以雙手各戴乙個。每個裝備都有乙個攻擊值和防禦值,現在要在防禦值至少到達m的情況下可以達到的最大攻擊力。思路 分組揹包題目。把單手 和盾組合起來放到雙手 當中,戒指也需要兩兩組合。接下來就是乙個分組...
6666 分組揹包
問題描述 乙個旅行者有乙個最多能裝v公斤的揹包,現在有n件物品,它們的重量分別是w1,w2,wn,它們的價值分別是c1,c2,cn。這些物品被劃分為若干組,每組中的物品互相衝突,最多選一件。求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。輸入格式 第1行 三個整數,v 揹...
分組揹包 Acwing 9 分組揹包問題
題目鏈結 有 n 組物品和乙個容量是 v 的揹包。每組物品有若干個,同一組內的物品最多只能選乙個。每件物品的體積是 vij,價值是 wij,其中 i 是組號,j 是組內編號。求解將哪些物品裝入揹包,可使物品總體積不超過揹包容量,且總價值最大。輸出最大價值。輸入格式 第一行有兩個整數 n,v,用空格隔...