HDU 2159 FATE 完全揹包

2021-08-21 10:20:35 字數 813 閱讀 6621

參考資料:

題意:公升級還需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 兩種代價可付出的最大值 兩種揹包容量 分...