FATE(HDU 2159)(完全揹包)

2021-09-24 23:54:16 字數 1136 閱讀 1688

題解:

我們可以以忍耐值為限制,求每個狀態(範圍內的忍耐值)下可獲得的最大的經驗值。

因為我們是要求最大的剩餘忍耐值,所以我們可以就遍歷dp,先看經驗值是否滿足公升級條件,然後再看是否滿足殺怪數在s內,如果都滿足了,直接出答案,如果遍歷完一遍還沒有滿足條件的答案,就輸出-1.

還有乙個地方就是處理殺怪的數量num,我們更新dp的時候,dp更新一次,num就要更新為在num[j-monster[i].b]的基礎上殺了乙隻怪。

**:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define p(x) x>0?x:0

#define inf 0x3f3f3f3f

using namespace std;

typedef

long

long ll;

typedef vector<

int>

:: iterator viter;

const

int maxn=

105;

int n,m,k,s;

int dp[maxn]

,num[maxn]

;int ans,ansi;

struct node

monster[maxn]

;void

init()

intmain()

for(

int i=

1;i<=k;i++

)//怪獸的種類數}}

int i=1;

for(

;i<=m;i++

)else

//殺怪數不在範圍內,繼續搜

continue;}

}if(i==

(m+1))

//不能得到所需經驗值或者需要殺的怪大於最多的殺怪數

printf

("-1\n");

}return0;

}

hdu2159 完全揹包???

最近在刷dp,這道題看起來應該完全揹包的。最近xhd正在玩一款叫做fate的遊戲,為了得到極品裝備,xhd在不停的殺怪做任務。久而久之xhd開始對殺怪產生的厭惡感,但又不得不通過殺怪來公升完這最後一級。現在的問題是,xhd昇掉最後一級還需n的經驗值,xhd還留有m的忍耐度,每殺乙個怪xhd會得到相應...

HDU2159 完全揹包

fate 題意 xhd昇掉最後一級還需n的經驗值,xhd還留有m的忍耐度,每殺乙個怪xhd會得到相應的經驗,並減掉相應的忍耐度。當忍耐度降到0或者0以下時,xhd就不會玩這遊戲。xhd還說了他最多隻殺s只怪。n,m,k,s 0 n,m,k,s 100 四個正整數。分別表示還需的經驗值,保留的忍耐度,...

HDU 2159 FATE ,完全揹包

把忍耐值和殺怪數當成兩個揹包 dp i j 表示忍耐值為i,殺怪數為j時的經驗 dp i j max dp i j dp i b i j 1 a i 顯然,它只是要求殺怪數不超過s,那麼dp i s 肯定是消耗忍耐值為i時,獲得的最大經驗了 所以從小到大列舉忍耐值m,當dp i s n時,就brea...