用记忆话搜索的可能时间上稍微慢点。
/*
几个陷阱吧
一个是可能出现攻击比防御小的情况,那么取伤害为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;
}