链接:377. 组合总和 Ⅳ
1。将问题转换为背包问题
可以看作是背包问题,背包重量是target,物品是nums中的数,每次从nums中选一个放到背包中,问装满背包的方案数有多少,物品(nums中的数)可以重复使用。
2.dp定义:
定义一个dp数组,dp[i]含义为:为放满重量(target)为i的方案数为dp[i]
3:递推公式:
当放入最后一个物品时的物品重量weight=nums[j],那么装满背包的方案数就变成了i-x
所以:dp[i]=sum(dp[i-nums[j]] for j in range(len(nums)))
4.dp数组的初始化:
当背包重量为0的时候,装满的方案就是1,因为不放物品嘛。所以:dp[0]=1
最终代码为:
class Solution:
def combinationSum4(self, nums: List[int], target: int) -> int:
lis=[1]+[0]*target
for i in range(1,target+1):
lis[i]=sum(lis[i-x] for x in nums if x<=i) # 当x>i的时候我们要跳过,因为重量已经超了
return lis[target]
看起来是不是很简单呀
5.递归方式:
使用递归的时候记得用@cache缓存器
class Solution:
def combinationSum4(self, nums: List[int], target: int) -> int:
@cache
def dfs(i):
if i==0: # 背包装满了
return 1 # 条件满足,返回一个方案数
return sum(dfs(i-x) for x in nums if x<=i)
return dfs(target)