ZOJ 3769 (分組揹包)

2021-08-04 06:26:16 字數 1433 閱讀 8241

題意:

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,用空格隔...