完全背包
518. 零钱兑换 II
这道题只能先遍历物品,再遍历背包 纯的完全背包问题两个for循环可以变换顺序,这里不可以
for(i=0;i<coins.size;i++) 物品
for(j=coins[i];j<=amount;j++) 背包{
} 这样得到的是组合数
for(j=0;j<=amount;j++) 背包
for(i=0;i<coins.size;i++) 物品{
} 这样得到的是排列数
class Solution:
def change(self, amount: int, coins: List[int]) -> int:
#dp[j]:装满容量为j的背包,有dp[j]种方法
dp=[0]*(amount+1)
dp[0]=1
for i in range(len(coins)):
for j in range(coins[i],amount+1):
dp[j]+=dp[j-coins[i]]
return dp[amount]
377. 组合总和 Ⅳ
先物品再背包,得到的是组合数;先背包再物品,得到的是排列数
class Solution:
def combinationSum4(self, nums: List[int], target: int) -> int:
#dp[j]:装满容量为j的背包,有dp[j]种组合方法
dp=[0]*(target+1)
dp[0]=1
for j in range(target+1):
for i in range(len(nums)):
if j>=nums[i]:
dp[j]+=dp[j-nums[i]]
return dp[target]
拓展题:
爬楼梯爬n阶,一步可以爬1,2,...,m步台阶,求爬到楼顶有多少种方法
答:求排列数,先背包再物品