题目链接:52. 携带研究材料(第七期模拟笔试) (kamacoder.com)
m, n = map(int, input().split())
value = []
weight = []
for i in range(m):
w, v = map(int, input().split())
weight.append(w)
value.append(v)
dp = [0] * (n + 1)
for i in range(m):
for j in range(weight[i] ,n + 1):
dp[j] = max(dp[j], dp[j-weight[i]] + value[i])
print(dp[n])
题目链接:518. 零钱兑换 II - 力扣(LeetCode)
思路:假设有1 2 5 conis 要凑成amount = 5
所以
coins[0] 加入遍历 0:1, (从这里开始)1:0 + dp[1 - coins[0]], 2:0 + dp[1-coins[0]] ....
coins[1] 加入遍历 0:1, 1:1, (从这里开始)2:1 + dp[2-coins[0]] (1 +1的情况和2的情况)
所以递推方程为dp[j] = dp[j] + dp[j - coins[i]]
class Solution(object):
def change(self, amount, coins):
"""
:type amount: int
:type coins: List[int]
:rtype: 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] + dp[j - coins[i]]
return dp[amount]
题目链接:377. 组合总和 Ⅳ - 力扣(LeetCode)
思路:这道题组成有顺序,所以先遍历物品再遍历重量是有讲究的。先遍历物品,再遍历背包,只会得到一种情况 例如{1, 5} 而不会出现 {5 ,1} ; 而先遍历背包,再遍历物品,则会出现(1,5) 和 (5,1)
class Solution(object):
def combinationSum4(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
# 有目标值 且数组中的值可以放多次 考虑完全背包
dp = [0] * (target + 1)
dp[0] = 1
for i in range(target + 1):
for j in range(len(nums)):
if nums[j] <= i:
dp[i] = dp[i] + dp[i - nums[j]]
return dp[target]
题目链接:57. 爬楼梯(第八期模拟笔试) (kamacoder.com)
思路:楼梯总数可以看成背包容量,爬的阶梯数量可以看成硬币或者是重量,并且可以重复使用,考虑完全背包
n, m = map(int, input().split())
dp = [0] * (n + 1)
dp[0] = 1
for i in range(n + 1):
for j in range(1, m + 1):
dp[i] = dp[i] + dp[i - j]
print(dp[n])