网易2019年春招笔试:爬塔玩法

题目描述

在游中有个爬塔玩法,这个玩法由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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值