1、零钱兑换
class Solution:
def change(self, amount: int, coins: List[int]) -> int:
dp = [0]*(amount+1)
dp[0] = 1
# 先物品后背包,得到组合数
# 因为先把第i个物品遍历完了才到i+1
# 先背包后物品得到的是排列数
# 因为在每个背包都遍历全部i个物品
for i in range(len(coins)):
for j in range(coins[i], amount+1):
dp[j] += dp[j-coins[i]]
return dp[amount]
2、组合总和IV
class Solution:
def combinationSum4(self, nums: List[int], target: int) -> int:
dp = [0]*(target+1)
dp[0] = 1
# 先背包后物品,得到排列数
for j in range(1, target+1):
for i in range(len(nums)):
# 因为先遍历背包再遍历物品
# 所以要check背包能否放下物品
if j - nums[i] >= 0:
dp[j] += dp[j-nums[i]]
return dp[target]
3、爬楼梯
while 1:
try:
n, m = map(int, input().split())
dp = [0]*(n+1)
dp[0] = 1
# 先背包后物品,因为求排列
# 从dp1开始更新
for i in range(1,n+1):
# 遍历物品
for j in range(1,m+1):
# 保证背包装得下物品,或者说走一步不会越界
if i - j >= 0:
dp[i] += dp[i-j]
print(dp[n])
except:break