defsolve_optimized(): t = int(input()) for _ inrange(t): n, m = map(int, input().split()) skills = [] for _ inrange(n): skills.append(tuple(map(int, input().split()))) ans = -1 defdfs(blood, used=set()): nonlocal ans # 剪枝1: 假设剩余技能全部打出双倍伤害 rest_max_damage = sum([2 * skills[i][0] for i inrange(n) if i notin used]) if blood > rest_max_damage: return # 剪枝2: 如果当前已使用技能数不优于已知答案 if ans != -1andlen(used) >= ans: return # 成功条件 if blood <= 0: ans = min(ans, len(used)) if ans >= 0elselen(used) return # 失败条件 iflen(used) == n and blood > 0: return # 尝试每个未使用的技能 for i, (damage, threshold) inenumerate(skills): if i notin used: used.add(i) actual_damage = 2 * damage if blood <= threshold else damage dfs(blood - actual_damage, used) used.remove(i) dfs(m) print(ans)
def_even_enlarge(self, seed: int) -> int: """将种子扩展为偶数长度回文数,如123→123321""" ans = seed temp = seed while temp != 0: ans = ans * 10 + temp % 10 temp //= 10 return ans
def_odd_enlarge(self, seed: int) -> int: """将种子扩展为奇数长度回文数,如123→12321""" ans = seed temp = seed // 10 while temp != 0: ans = ans * 10 + temp % 10 temp //= 10 return ans
def_check(self, num: int, l: int, r: int) -> bool: """检查数字是否在范围内且为回文数""" return l <= num <= r andself._is_palindrome_num(num)
def_is_palindrome_num(self, num: int) -> bool: """判断数字是否为回文数""" if num < 0: returnFalse if num == 0: returnTrue # 双指针思想:同时从最高位和最低位比较 offset = 1 while num // offset >= 10: offset *= 10 while num != 0: if num // offset != num % 10: returnFalse num = (num % offset) // 10 offset //= 100 returnTrue