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