Day34-动态规划
1. 0-1背包(二维数组)
46. 携带研究材料(第六期模拟笔试)
n, bagweight = map(int, input().split())weight = list(map(int, input().split()))
value = list(map(int, input().split()))# dp[i][j]表示的是把0-i的所有物品选几个装进重量是j的背包的最大价值
dp = [[0]*(bagweight+1) for _ in range(n)]
for j in range(weight[0],bagweight+1):dp[0][j] = value[0]
for i in range(1,n):for j in range(bagweight+1):if j<weight[i]:dp[i][j] = dp[i-1][j] # 根本放不进去else:dp[i][j] = max(dp[i-1][j],dp[i-1][j-weight[i]]+value[i])
print(dp[n-1][bagweight])
不直观的一种写法,写了一维dp,这种自然就可以想到;但是理解性不如上一种【其实就是有一个坐标的倒换】
dp = [[0]*(bagweight+1) for _ in range(n+1)]
for i in range(1,n+1):for j in range(bagweight+1):if j<weight[i-1]:dp[i][j] = dp[i-1][j] # 根本放不进去else:dp[i][j] = max(dp[i-1][j],dp[i-1][j-weight[i-1]]+value[i-1])
print(dp[n][bagweight])
2. 0-1背包(一维数组)
# dp[j] 表示容量为j的背包所能装的最大价值【至于可以选择哪些物品,是我们在外层进行控制的】
dp=[0]*(bagweight+1)
# 仅仅初始化为0即可,相当于只有0个物品时,每个j容量的能装的最大价值
for i in range(n):# 正着就会装多遍!倒着装!for j in range(bagweight,0,-1):if j>=weight[i]:dp[j]=max(dp[j],dp[j-weight[i]]+value[i])
print(dp[bagweight])
3. 分割等和子集-416
416. 分割等和子集 - 力扣(LeetCode)
class Solution(object):def canPartition(self, nums):""":type nums: List[int]:rtype: bool"""# 其实就是求和nums的一半# 重量和value其实是一个!if sum(nums)%2:return Falsetarget = sum(nums)//2dp = [0 for _ in range(target+1)]for i in range(len(nums)):for j in range(target,nums[i]-1,-1):dp[j] = max(dp[j],dp[j-nums[i]]+nums[i])# dp[target]重量已经填充到target了,但是值还没有达到targetreturn dp[target]==target
