這個題由於變數比較多。 所以容易搞複雜。 其實看明白了 還是乙個揹包問題。
但是這個明顯就是 一種怪可以打很多個了。
有乙個細節需要注意。被這個細節坑了一發。 那就是 當 它的 經驗超過n的時候 也是可以公升級的。 比如 經驗需要3 有一種 可以得到經驗2 的怪。 那就必須殺兩個得到4個經驗
才能公升級。 而我第一次寫的**就是 只判斷了 3的情況。 所以就錯了。我往後推了一步。因為經驗最多就是20. 那我 直接得出 n----n+20之間的所有情況就好了
遞推公式比較好寫。 我用 d【i】【j】 表示 i經驗 j個怪的時候 所能用的最小忍耐度。
不過a了之後 去看別人寫的題解。 發現 用 d【i】【j】 表示 i 忍耐度 j個怪的時候 如果經驗 大於等於 n的時候 就是最優解。 這個好像更簡單 更好理解
#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include typedef long long ll;
typedef unsigned long long llu;
const double pi=acos(-1.0);
using namespace std;
#define maxn 100+21
#define inf 1 << 30
int d[maxn][maxn] = ;
struct game;
int main ()
game g[maxn];
for(int i = 1; i <= k; i++)
scanf("%d%d",&g[i].v,&g[i].de);
d[0][0] = 0;
for(int i = 0; i <= n+20; i++)}}
int m = inf;
for(int j = n; j <= n+20; j++)
if(m > m)
printf("-1\n");
else
printf("%d\n",m-m);
}return 0;
}
hdu 2159 FATE (二維揹包)
解題報告 二維揹包的問題,如果沒有看過的話,建議去看看揹包9講中的第五個問題。本題中有每殺乙個怪,會獲得一定的經驗,同時減少一定的忍耐度,我用二維陣列dp來存放每次獲得的經驗值,b i 為每次消耗的忍耐 所以可以的到遞推關係式 dp i j max dp i b i j 1 dp i j 資料有點多...
hdu 2159 FATE 二維揹包
先求出不超過他的忍耐度殺完s只怪時能夠得到的經驗值,如果能公升完最後一級,再求用去多少忍耐度就能夠公升級,最後用他的忍耐度減去需要消耗的忍耐度即可 忍耐度當做體積,經驗值當做價值,怪的隻數當做物品數量 狀態轉移方程 f i j max i表示忍耐度,j表示殺怪數 忍耐度當做體積,經驗值當做價值,怪的...
HDU 2159 FATE 二維揹包
這題是乙個二維揹包的題目,剛開始並沒有那樣去做,只開了一維的空間來儲存狀態,結果很多的資料都沒有跑過去。其實這題這樣來問的話可能就明了很多了,求在指定的容忍值和指定的殺怪數下,求最大能夠得到了經驗數,可能我們馬上就能想到二維揹包,一維為殺怪數,二維為容忍值,在做乙個完全揹包,可惜這題問的是在滿足公升...