參考資料:
題意:公升級還需n點經驗值,還有m點忍耐度,殺乙個怪會得到相應的經驗,並減掉相應的忍耐度。當忍耐度降到0或者0以下時,最多隻殺s只怪。能公升級,輸出最大剩餘耐久。不能公升級,輸出-1。
完全揹包概述:
有n種物品和乙個容量為v的揹包,每種物品都有無限件可用。
第i種物品的體積是c,價值是w。求解將哪些物品裝入揹包可使這些物品的體積總和不超過揹包容量,且價值總和最大。
揹包思想:
明確:在給定忍耐度下,殺掉給定只怪物,希望得到最大價值
對應:怪物 —— 物品
給定忍耐度、給定怪物 —— 體積(揹包容量)
解題思路:
0.讀入資料,並初始化相關陣列(清零)
1.首先,列舉物品(怪物,即k)
2.然後,根據完全揹包問題,列舉限制條件1(裝備耐久度,即m)(遞增列舉)
3.接著,列舉限制條件2(殺怪數量,即s)
至此,我們得到了dp陣列,dp[m][s]表示用m點忍耐度殺死s只怪所能獲得的最大經驗值。
4.最後,從(1,1)→(m,s)掃一遍dp陣列,得到第乙個滿足公升級條件的m0值,輸出m-m0
(利用flag標記,得到立即跳出迴圈輸出,得不到輸出-1)
核心**:
for(int i = 0; i <= k; i++)
for(int j = b[i]; j <= m; j++)
for(int f = 1; f <= s; f++)
dp[j][f] = max(dp[j][f], dp[j-b[i]][f-1] + a[i]);
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...
HDU 2159(FATE) 完全揹包
最近xhd正在玩一款叫做fate的遊戲,為了得到極品裝備,xhd在不停的殺怪做任務。久而久之xhd開始對殺怪產生的厭惡感,但又不得不通過殺怪來公升完這最後一級。現在的問題是,xhd昇掉最後一級還需n的經驗值,xhd還留有m的忍耐度,每殺乙個怪xhd會得到相應的經驗,並減掉相應的忍耐度。當忍耐度降到0...
hdu 2159 FATE 多重揹包
二維費用的揹包問題是指 對於每件物品,具有兩種不同的費用 選擇這件物品必須同時付出這兩種代價 對於每種代價都有 乙個可付出的最大值 揹包容量 問怎樣選擇物品可以得到最大的價值。設這兩種代價分別為代價1和代價2,第i件物品所需的兩種代價分別為a i 和 b i 兩種代價可付出的最大值 兩種揹包容量 分...