完全背包
def test_CompletePack():
weight = [1, 3, 4]
value = [15, 20, 30]
bagWeight = 4
dp = [0] * (bagWeight + 1)
for i in range(len(weight)): # 遍历物品
for j in range(weight[i], bagWeight + 1): # 遍历背包容量
dp[j] = max(dp[j], dp[j - weight[i]] + value[i])
print(dp[bagWeight])
test_CompletePack()
- 零钱兑换 II
class Solution:
def change(self, amount: int, coins: List[int]) -> int:
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]
- 组合总和 Ⅳ
class Solution:
def combinationSum4(self, nums: List[int], target: int) -> int:
# dp[][j]和为j的组合的总数
dp = [[0] * (target+1) for _ in nums]
for i in range(len(nums)):
dp[i][0] = 1
# 这里不能初始化dp[0][j]。dp[0][j]的值依赖于dp[-1][j-nums[0]]
for j in range(1, target+1):
for i in range(len(nums)):
if j - nums[i] >= 0:
dp[i][j] = (
# 不放nums[i]
# i = 0 时,dp[-1][j]恰好为0,所以没有特殊处理
dp[i-1][j] +
# 放nums[i]。对于和为j的组合,只有试过全部物品,才能知道有几种组合方式。所以取最后一个物品dp[-1][j-nums[i]]
dp[-1][j-nums[i]]
)
else:
dp[i][j] = dp[i-1][j]
return dp[-1][-1]
- 爬楼梯 (进阶)
def climbing_stairs(n,m):
dp = [0]*(n+1) # 背包总容量
dp[0] = 1
# 排列题,注意循环顺序,背包在外物品在内
for j in range(1,n+1):
for i in range(1,m+1):
if j>=i:
dp[j] += dp[j-i] # 这里i就是重量而非index
return dp[n]
if __name__ == '__main__':
n,m = list(map(int,input().split(' ')))
print(climbing_stairs(n,m))