文章目录
- 46. 携带研究材料
- 416. 分割等和子集
46. 携带研究材料
卡码网 46. 携带研究材料
代码随想录
dp[i][j]表示,考虑到第i个物品的情况下,背包容量为j的最大价值。
m, n = map(int, input().split(" "))
costs = list(map(int, input().split(" ")))
values = list(map(int, input().split(" ")))# 二维背包
dp = [[0]*(n+1) for _ in range(m)]for i in range(costs[0],(n+1),1):dp[0][i] = values[0]for i in range(1,m):for j in range((n+1)):if j < costs[i]:dp[i][j] = dp[i-1][j]else:dp[i][j] = max(dp[i-1][j], dp[i-1][j-costs[i]] + values[i])print(dp[m-1][n])
# print(input())
m, n = map(int, input().split(" "))
costs = list(map(int, input().split(" ")))
values = list(map(int, input().split(" ")))# 一维背包
dp = [0] * (n+1)for i in range(m):for j in range(n,costs[i]-1,-1):if j >= costs[i]:dp[j] = max(dp[j], dp[j-costs[i]] + values[i])print(dp[n])
416. 分割等和子集
leetcode 416. 分割等和子集
代码随想录
找是否有满足sum(nums)/2的组合,最终的容量和价值都为这个值。
class Solution:def canPartition(self, nums: List[int]) -> bool:num_sum = sum(nums)target = 0if num_sum%2 != 0:return Falseelse:target = int(num_sum / 2)dp = [0] * 10001for 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])if dp[target] == target:return Truereturn False