HOJ 2159 FATE(完全揹包)

2021-10-09 14:32:46 字數 1314 閱讀 1693

完全揹包

k 個怪物, 每打乙個怪物有經驗, 消耗忍耐度。 可以把 經驗看做是 價值 w[i], 忍耐度看做是體積 v[i].

題目轉化為, 用乙個體積為 m 的揹包,裝一些物品(每乙個物品可以裝無限次), 取得的最大價值。

裸的完全揹包題目。

本題要點:

1、n <= 100, 可開二維陣列。 但是,這裡有個限制,取的物品總數不能超過 s 個。所用,需要乙個陣列 mp[maxn][maxn]

來計數, 以保證取物品,不超過 s 個。

2、f[i][j] 表示 從前i個物品中,選出總體積是j的物品,最大價值

mp[i][j] 表示計算 f[i][j] 時候,一共選擇了多少物品

3、 最後要求輸出的是,在消耗最少的體積的情況下,能夠獲得 n 的價值。 答案就是,算出來的每乙個 f[i][j],

找出乙個 f[i][j] >= n 時候, m - j 的最大值(剩餘體積,就是剩餘忍耐度)

#include

#include

#include

using

namespace std;

const

int maxn =

110, inf =

0xcfcfcfcf

;int n, m, k, s;

int w[maxn]

, v[maxn]

;// 價值,體積

int f[maxn]

[maxn]

;// f[i][j] 表示 從前i個物品中,選出總體積是j的物品,最大價值

int mp[maxn]

[maxn]

;// mp[i][j] 表示計算 f[i][j] 時候,一共選擇了多少物品

void

solve()

} f[0]

[0]=

0;for(

int i =

1; i <= k;

++i)

for(

int j = v[i]

; j <= m;

++j)}}

for(

int j =

0; j <= m;

++j)}}

printf

("%d\n"

, ans);}

intmain()

solve()

;}return0;

}/*10 10 1 10

1 110 10 1 9

1 19 10 2 10

1 12 2

*//*0-1

1*/

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 完全揹包

參考資料 題意 公升級還需n點經驗值,還有m點忍耐度,殺乙個怪會得到相應的經驗,並減掉相應的忍耐度。當忍耐度降到0或者0以下時,最多隻殺s只怪。能公升級,輸出最大剩餘耐久。不能公升級,輸出 1。完全揹包概述 有n種物品和乙個容量為v的揹包,每種物品都有無限件可用。第i種物品的體積是c,價值是w。求解...

HDU 2159(FATE) 完全揹包

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