第一行输入一个整数
,代表有
组测试数据。
对于每一组测试数据,一行输入
个整数
和
,代表有
个技能,怪物有
点血量。
接下来
行,每一行输入两个数
和
,代表该技能造成的伤害和怪物血量小于等于
的时候该技能会造成双倍伤害
对于每一组数据,输出一行,代表使用的最少技能数量,若无法消灭输出-1。
3 3 100 10 20 45 89 5 40 3 100 10 20 45 90 5 40 3 100 10 20 45 84 5 40
3 2 -1
总共3组数据对于第一组:我们首先用技能1,此时怪物血量剩余90,然后使用技能3,此时怪物剩余血量为85,最后用技能2,由于技能2在怪物血量小于89的时候双倍伤害,故此时怪物已经消灭,答案为3对于第二组:我们首先用技能1,此时怪物血量剩余90,然后用技能2,由于技能2在怪物血量小于90的时候双倍伤害,故此时怪物已经消灭,答案为2对于第三组:我们首先用技能1,此时怪物血量剩余90,然后使用技能3,此时怪物剩余血量为85,最后用技能2,由于技能2在怪物血量小于84的时候双倍伤害,故此时怪物无法消灭,输出-1
t = int(input()) for _ in range(t): #n个技能,m点血量 n,m = list(map(int,input().split())) tem = [] #存储每个技能的伤害 #tem.sort(key=lambda x:(-x[1],-x[0])) for _ in range(n): tem.append(tuple(map(int,input().split()))) length = len(tem) ans = -1 def dfs(blood,visit=set()): global ans #假设剩余技能全部打出二倍伤害 rest_max_sum = sum([2*tem[i][0] for i in range(length) if i not in visit]) if blood > rest_max_sum: return #剪枝 if ans != -1 and len(visit) >= ans: return #剪枝 if len(visit) == length and blood > 0: return if blood <= 0: ans = min(ans,len(visit)) if ans >= 0 else len(visit) for ind,(x,y) in enumerate(tem): if ind not in visit: visit.add(ind) if blood <= y: dfs(blood-2*x,visit) else: dfs(blood-x,visit) visit.remove(ind) dfs(m) print(ans)