典型背包问题!
代码如下:
状态: 可选择的物品、可装的重量
选择:装 or 不装
d[i][w]:表示在前i个物品可选的情况下,可装重量为w的情况下,最大的价值
class Solution:
def bagFunc(self, W, N, weight, val ):
dp = [[0] * (w+1) for i in range(N+1)]
for i in range(1,N):# 遍历物品 状态1
for w in range(1,W): # 遍历能承受的重量可能情况 状态2
if w-weight[i-1] < 0:#此时已经装不下了,那就只能跳过
dp[i][w] = dp[i-1][w] # 选择1 不装
else:
dp[i][w] = max(dp[i-1][w], dp[i][w-weight[i-1]]+val[i-1]) # 选择1 2 装或不装
return dp[n][w] # 返回最后的情况
0-1背包的应用问题
分割等和子集🔗
class Solution:
def canPartition(self, nums: List[int]) -> bool:
# 转换成 没有有背包大小为sum(nums)/2, 物品个数为len(nums),重量为nums[i]。刚好能把背包装满
# 状态 背包重量 , 可选择的物品
# 选择 装或者不装
# 状态转移方程
summ = sum(nums)
if summ %2 !=0: return False
W = int(summ/2)
n = len(nums)
dp = [[False]*(W+1) for i in range(n+1)]
for i in range(n+1):
dp[i][0] = True
for i in range(1, n+1):
for w in range(1,W+1):
if w - nums[i-1] < 0:
dp[i][w] = dp[i-1][w]
else:
dp[i][w] = dp[i-1][w] or dp[i-1][w-nums[i-1]]
return dp[n][W]