对"小M最近在玩一款叫做“狼人拯救者”的游戏。在游戏中,玩家可以通过消耗金币来购买能力,这些能力会增加攻击力,但也会影响攻击速度。小M是一个以攻击力为优先的玩家,但他必须保证自己的攻击速度不能低于0,因为攻击速度为负时将无法攻击。现在小M面对商店中的N种能力,他拥有G枚金币和S点初始攻击速度。他想知道,在保持攻击速度大于等于0的前提下,他最多可以获得多少攻击力。"的解析: 首先,先理清解题思路:商店中每种能力用三元组表示为 ‘array[i] = [c, s, d]’,其中: ‘c’ 表示购买该能力需要的金币数;'s' 表示该能力对攻击速度的影响,可以为正数、零或负数;'d' 表示该能力对攻击力的增加值。 定义状态:'dp[i][j]'表示在前 'i' 种能力中,花费 'j' 枚金币时,能够获得的最大攻击力。'speed[i][j]'表示在前 'i' 种能力中,花费 'j' 枚金币时,剩余的攻击速度。状态转移:对于每种能力 '[c, s, d]',我们可以选择购买或不购买:不购买:'dp[i][j] = dp[i-1][j]','speed[i][j] = speed[i-1][j],购买:'dp[i][j] = dp[i-1][j-c] + d','speed[i][j] = speed[i-1][j-c] + s',如果购买后攻击速度小于0,则不能购买。 初始化:'dp[0][j] = 0'表示没有购买任何能力时,攻击力为0。'speed[0][j] = S'表示没有购买任何能力时,攻击速度为初始值 'S'。 最终结果:遍历 'dp[n][j]',找到最大值。 def solution(n, g, s, array): dp = [[0] * (g + 1) for _ in range(n + 1)] speed = [[s] * (g + 1) for _ in range(n + 1)] for i in range(1, n + 1): c, s, d = array[i - 1] for j in range(g + 1): dp[i][j] = dp[i - 1][j] speed[i][j] = speed[i - 1][j] if j >= c and speed[i - 1][j - c] + s >= 0: new_attack = dp[i - 1][j - c] + d if new_attack > dp[i][j]: dp[i][j] = new_attack speed[i][j] = speed[i - 1][j - c] + s max_attack = max(dp[n]) return max_attack
if name == "main": test1 = [ [71, -51, 150], [40, 50, 100], [40, 50, 100], [30, 30, 70], [30, 30, 70], [30, 30, 70], ] print(solution(6, 100, 100, test1) == 240) test2 = [ [71, -51, 150], [40, -50, 100], [40, -50, 100], [30, -30, 70], [30, -30, 70], [30, -30, 70], ] print(solution(6, 100, 100, test2) == 210) test3 = [ [25, -25, 100], [25, -25, 50], [20, 0, 60], [15, -15, 40], [10, -5, 30], ] print(solution(5, 50, 50, test3) == 170) 这样,我们就可以在保持攻击速度大于等于0的前提下,找到小M最多可以获得的攻击力。