用记忆话搜索的可能时间上稍微慢点。
/* 几个陷阱吧 一个是可能出现攻击比防御小的情况,那么取伤害为1 另一种就是经验不清零,题目没提及吧 */ #include <stdio.h> #include <string.h> struct LVBU { int ATI,DEF,HP,EXP,level; }peo[21], lv; int In_ATI,In_DEF,In_HP; int n; int N; LVBU dp[1 << 20]; bool vis[1 << 20]; void solve(int sta) { if(vis[sta]) return; vis[sta] = 1; int state = sta; int i = 0; bool flag = false; while(state) { if(state & 1) { solve(sta ^ (1 << i)); LVBU t= dp[sta ^ (1 << i)]; if(t.level <= 0) { state >>= 1; i++; continue;//已经挂了 } int dec = t.ATI - peo[i].DEF; if(dec <= 0) dec = 1;//特殊情况 int times = peo[i].HP / dec; if(times * dec != peo[i].HP) times++; dec = peo[i].ATI - t.DEF; if(dec <= 0) dec = 1; t.HP -= dec * (times - 1); if(t.HP <= 0) { state >>= 1; i++; continue; } t.EXP += peo[i].EXP; if(t.EXP >= t.level * 100) { int add = t.EXP / 100 - t.level + 1; t.level += add; t.ATI += add * In_ATI; t.DEF += add * In_DEF; t.HP += add * In_HP; } if(!flag || (t.HP > dp[sta].HP) || (t.HP == dp[sta].HP && t.level > dp[sta].level)) { dp[sta] = t; flag = true; } } state >>= 1; i++; } if(!flag) dp[sta].level = -1;//没希望了。。。。 return; } int main() { while(scanf("%d%d%d%d%d%d", &dp[0].ATI, &dp[0].DEF, &dp[0].HP, &In_ATI, &In_DEF, &In_HP) != EOF) { dp[0].EXP = 0;//一个人没杀的初始状态 dp[0].level = 1; char name[200]; scanf("%d", &n); for(int i = 0; i < n; i++) scanf("%s%d%d%d%d", name, &peo[i].ATI, &peo[i].DEF, &peo[i].HP, &peo[i].EXP); N = 1 << n; memset(vis, 0, sizeof(vis)); vis[0] = 1; solve(N - 1); lv = dp[N-1]; if(lv.level <= 0) printf("Poor LvBu,his period was gone.\n"); else printf("%d\n", lv.HP); } return 0; }