原題鏈結
公升級打怪。公升級需要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會得到相應的...