HDU 2159 Fate 二維完全揹包

2021-08-04 05:05:57 字數 994 閱讀 5931

原題鏈結

公升級打怪。公升級需要n點經驗值,需要打怪來獲取經驗值。每打乙個怪可以得到v[i]經驗值,同時也會消耗c[i]耐性度,且打怪個數不許超過s,怪的種類為k,每種怪的個數無限。求公升級需要的最小耐性度,當然也是求剩餘最大耐性度。

這是乙個二維費用揹包問題。費用之一是耐性度,費用之二是打怪個數。

我們注意到每種怪的個數是無限的,這說明耐性度可以花費在統一種類的怪上,那麼在「耐性度」這個維度上,我們需要正序遍歷(完全揹包)。而「打怪個數」這個維度與「每種怪的個數」無耦合性,正序逆序皆可。

#include

#include

#include

#include

using

namespace

std;

int c[105], v[105];

int dp[105][105];

int main() }}

if(dp[m][s] < n)

int num = m;

for(int i = 0; i <= m; i++)

}cout

<< m-num << endl;

}return

0;}

另一種思路,每次更新dp時,我們都查詢是否達到經驗值n且是否花費了更少的耐性度。與第一種思路相比,可以避免dp後的矩陣遍歷過程。

#include

#include

#include

#include

using

namespace

std;

int c[105], v[105];

int dp[105][105];

const

int inf = 0x3f3f3f3f;

int main() }}

}if(flag == 1)

else

}return

0;}

HDU2159 FATE 二維完全揹包

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

HDU 2159 FATE(二維完全揹包)

中文題目就不用解釋了 就是裸的二維完全揹包 d i j 表示消耗i忍耐殺j個怪最多可獲得的經驗 然後就用完全揹包來做了 二維揹包揹包不過是多了一重迴圈 include include includeusing namespace std const int n 105 int main return...

HDU 2159 FATE 二維完全揹包

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