題解:
我們可以以忍耐值為限制,求每個狀態(範圍內的忍耐值)下可獲得的最大的經驗值。
因為我們是要求最大的剩餘忍耐值,所以我們可以就遍歷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...