中兴算法:击杀怪物的最少技能数,回溯

def get_skill_num(As, xs, n, m):
    if n<=0&nbs***bsp;m<=0:
        return 0
    temp = [False]*n  # temp[i]表示技能未使用
    res = []          # 每个使用过技能造成的伤害
    results = []      # 击杀成功的可能技能数

    # m表示剩余血量
    def get_res(m):
        # print(res, m)
        if m<=0:        # 当血量<=0,击杀成功, 追加技能数到结果中
            results.append(len(res))
            return
        if False not in temp:      # 技能用完,但未击杀,返回
            return
        for i in range(n):         # 遍历每个未使用的技能
            if temp[i]==False:
                temp[i] = True            # 设置技能已使用
                if m<=xs[i]:              # 若剩余点数少于该技能阈值
                    res.append(2*As[i])   # 双倍伤害
                    m -= 2*As[i]          # 剩余血量减少
                    get_res(m)            # 递归使用其他技能
                    m += 2 * As[i]        # 回溯,不使用该技能
                else:
                    res.append(As[i])
                    m -= As[i]
                    get_res(m)
                    m += As[i]
                temp[i] = False           # 回溯, 不使用该技能
                res.pop()                 # 回溯,不使用该技能
    get_res(m)
    if results==[]:  # 如果各种技能顺序组合都不能击杀,该list是空的
        return -1
    res = results[0]   # 返回最小击杀技能数
    for i in results:
        res = min(i, res)
    return res

if __name__ == "__main__":
    n, m = 3, 100    # n,技能数;m,怪物血量
    As = [10, 45, 5]     # 每个技能的伤害
    xs = [20, 84, 40]    # 触发每个技能暴击的条件——怪物的剩余血量
    res = get_skill_num(As, xs, n, m)
    print(res)

    xs1 = [20, 89, 40]  # 触发每个技能暴击的条件——怪物的剩余血量
    res = get_skill_num(As, xs1, n, m)
    print(res)

    xs2 = [20, 90, 40]  # 触发每个技能暴击的条件——怪物的剩余血量
    res = get_skill_num(As, xs2, n, m)
    print(res)

#笔试题目#
全部评论

相关推荐

2024-12-25 16:59
已编辑
江西师范大学科学技术学院 HRBP
沐雨千秋:难,这实习一眼兼职暑假工
点赞 评论 收藏
分享
2024-12-26 20:46
复旦大学 C++
国棉17厂丶小王:拿了offer的那个周末晚上去网吧通宵,去网吧不知道玩什么刷了lc的每日一题,然后试着第一次打开了三角洲行动,从此少了一个已经刷了700道题的lc用户,但是烽火地带多了一只🐭🐭
点赞 评论 收藏
分享
评论
1
4
分享

创作者周榜

更多
牛客网
牛客企业服务