当前位置: 首页> 文旅> 旅游 > day_35

day_35

时间:2025/7/8 16:58:15来源:https://blog.csdn.net/wzy_777/article/details/141036805 浏览次数:0次

46. 携带研究材料(第六期模拟笔试)

n, bagweight = map(int, input().split())
weight = list(map(int, input().split()))
value = list(map(int, input().split()))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[i][j]表示从前i个物品中选择,放入容量为j的书包,拥有的最大价值。
对应dp数组如下:

物品可选数量 \ 背包容量0123
0----
1----
2----

46. 携带研究材料(第六期模拟笔试)

n, bagweight = map(int, input().split())
weight = list(map(int, input().split()))
value = list(map(int, input().split()))dp = [0] * (bagweight + 1)for i in range(n):for j in range(bagweight, weight[i] - 1, -1):dp[j] = max(dp[j], dp[j - weight[i]] + value[i])print(dp[bagweight])

这里倒序是为了遍历不覆盖上一次的数据,并且重量只需要遍历到weight[i]就行了,不需要遍历到零,因为这个是背包的容量,背包的容量小于i物品的重量,那么他能放的东西也只到i-1,上次的状态(数据)不会更新。

416. 分割等和子集

class Solution:def canPartition(self, nums: List[int]) -> bool:if sum(nums) % 2 != 0:return Falsehalf = sum(nums) // 2dp = [0] * (half + 1)for numi in nums:for j in range(half, numi - 1, -1):dp[j] = max(dp[j], dp[j - numi] + numi)return dp[half] == half

有点抽象,那容量为一半的背包去装,如果能装满,说明符合条件。那么背包容量就应该是half,装满的情况是:dp[half] == half

关键字:day_35

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: