题目描述
在游中有个爬塔玩法,这个玩法由N个标号为0到N-1顺序连接的房间组成,玩家初始有H点血量,进入0号房间
在第i个房间内玩家可以选择以下两种操作之一:
·在这个房间内战斗,玩家会损失Xi点血量,获得Yi点经验,战斗结束后如果剩余血量大于0,则进入顺序连接的下一个i+1号房间,如果血量小于等于0游戏结束
·损失Zi点血量, 跳过这个房间进入顺序连接的下个i+1号房间,如果当前跳过的房间标号是N-1,则此次跳过操作后游直接结束
任何时候当玩家血量小于等于0时,或者玩家离开N-1号房间时,游教结束
请在给定N,H,以及每个房间的Xi,Yi,Zi的数值下,玩家采用最优策略玩游戏可以获得的最大总经验值是多少
0 < N,Xi,Yi,Zi <= 100, 0 < H <= 1000,
输入描述:
每组输入数据两行
第一行包括两个整数,N,H,0 < N <= 100,0 < H <= 1000 第二行包括3*N个整效,
分别是按顺序每个房间的Xi,Yi,Zi,0 < Xi,Yi,Zi <= 100
输出描述:
请输出一个整数,玩家采用最优策略玩游戏可以获得的最大总经验值
示例1 输入输出示例仅供调试,后台判断数据一般不包含示例
输入
3 1000
900 100 500 900 100 400 500 900 1000
输出
900
求解思路:利用递归方法求解
#include <iostream>
#include <algorithm>
using namespace std;
int N,X[100],Y[100],Z[100];
int fight(int i, int ex, int h);
int goNextRoom(int i, int ex, int h);
int getMaxExperience(int i, int ex, int h);
int main(){
int H;
cin >> N >> H;
for(int i=0; i<N; i++){
cin >> X[i] >> Y[i] >> Z[i];
}
int maxEx = getMaxExperience(0, 0, H);
cout << maxEx << endl;
return 0;
}
//选择战斗
int fight(int i, int ex, int h){
return getMaxExperience(i+1, ex+Y[i], h-X[i]);
}
//选择跳过此房间,进入下一个房间
int goNextRoom(int i, int ex, int h){
return getMaxExperience(i+1, ex, h-Z[i]);
}
//求可以获得的最大经验值
int getMaxExperience(int i, int ex, int h){
int maxEx=ex,ex1=0,ex2=0;
if(h>0 && i<N){
maxEx = max(fight(i,ex,h),goNextRoom(i,ex,h));
}
return maxEx;
}