HDU 2159 FATE(二維dp揹包)

2021-06-26 19:59:54 字數 1143 閱讀 4667

這個題由於變數比較多。 所以容易搞複雜。 其實看明白了 還是乙個揹包問題。

但是這個明顯就是 一種怪可以打很多個了。

有乙個細節需要注意。被這個細節坑了一發。 那就是 當 它的 經驗超過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 二維揹包

這題是乙個二維揹包的題目,剛開始並沒有那樣去做,只開了一維的空間來儲存狀態,結果很多的資料都沒有跑過去。其實這題這樣來問的話可能就明了很多了,求在指定的容忍值和指定的殺怪數下,求最大能夠得到了經驗數,可能我們馬上就能想到二維揹包,一維為殺怪數,二維為容忍值,在做乙個完全揹包,可惜這題問的是在滿足公升...