HDOJ 2159 FATE (二維揹包)

2021-06-07 23:39:17 字數 1044 閱讀 4516

思路:根據揹包9講的二維揹包問題。

摘自揹包九講:

問題

二維費用的揹包問題是指:對於每件物品,具有兩種不同的費用;選擇這件物品必須同時付出這兩種代價;對於每種代價都有乙個可付出的最大值(揹包容量)。問怎樣選擇物品可以得到最大的價值。設這兩種代價分別為代價1和代價2,第i件物品所需的兩種代價分別為a[i]和b[i]。兩種代價可付出的最大值(兩種揹包容量)分別為v和u。物品的價值為w[i]。

演算法

費用加了一維,只需狀態也加一維即可。設f[i][v][u]表示前i件物品付出兩種代價分別為v和u時可獲得的最大價值。狀態轉移方程就是:

f[i][v][u]=max

如前述方法,可以只使用二維的陣列:當每件物品只可以取一次時變數v和u採用逆序的迴圈,當物品有如完全揹包問題時採用順序的迴圈。當物品有如多重揹包問題時拆分物品。這裡就不再給出偽**了,相信有了前面的基礎,你能夠自己實現出這個問題的程式。

物品總個數的限制

有時,「二維費用」的條件是以這樣一種隱含的方式給出的:最多只能取m件物品。這事實上相當於每件物品多了一種「件數」的費用,每個物品的件數費用均為1,可以付出的最大件數費用為m。換句話說,設f[v][m]表示付出費用v、最多選m件時可得到的最大價值,則根據物品的型別(01、完全、多重)用不同的方法迴圈更新,最後在f[0..v][0..m]範圍內尋找答案。

小結

當發現由熟悉的動態規劃題目變形得來的題目時,在原來的狀態中加一緯以滿足新的限制是一種比較通用的方法。希望你能從本講中初步體會到這種方法。

code:

#include #include int main()

}flag = -1;

for(i = 1; i<=m; i++)

}if(flag == -1)

printf("-1\n");

else

printf("%d\n",flag);

}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 二維揹包

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