LeetCode第6310题-获得分数的方法数-python实现-图解思路与手撕代码
一、题目描述
二、解题思路与代码实现
1.解题思路
从n种方案寻找满足要求的方案数,这是一个背包问题。
用回溯的解法,从前n种题中选取m分,从前n-1种题中选取m-k*types[n][1]分。
具体写法可以直接看代码。
2.代码实现
代码如下(示例):
class Solution:
def waysToReachTarget(self, target: int, types: List[List[int]]) -> int:
# 背包问题
# 从前n种题中选取m分,从前n-1种题中选取m-k*types[n][1]分
MOD=10**9+7
# 这里回溯会产生很多类似问题,比如多个dfs(n-1,m),dfs(n-2,m)
# 所以可以加个cache修饰符转化成记忆化搜索,以加快运算速度
@cache
def dfs(n:int, m:int):
# 从后往前遍历,如果n<0,就结束
if n<0:return 0 if m>0 else 1
# k的选择范围是0-min(types[n][0],m//types[n][1])
count,marks=types[n]
res=0
for k in range(min(count,m//marks)+1):
res+=dfs(n-1,m-k*marks)
return res%MOD
return dfs(len(types)-1,target)