当前位置: 首页 > news >正文

01背包,完全背包,多重背包

类型物品选择规则动态规划特点遍历顺序典型应用场景
01背包每件物品最多选1次逆序遍历容量,避免重复选择从大到小遍历容量唯一性选择问题(如装物品)
完全背包每件物品可选无限次正序遍历容量,允许重复叠加从小到大遍历容量无限资源问题(如零钱兑换)
多重背包无限资源问题(如零钱兑换)可拆分为多个01背包物品或二进制优化处理拆分后逆序或正序有限次数的资源分配问题

01背包问题

给定容量为V的背包和N件物品,每件物品有重量w[i]和价值v[i],每个物品只能选0或1次,求最大价值

状态转移方程:

dp[j] = max(dp[j], dp[j - w[i]] + v[i])

代码实现:

dp = [0] * (V + 1)
for i in range(1, N+1):
    for j in range(V, w[i]-1, -1):  # 逆序遍历
        dp[j] = max(dp[j], dp[j - w[i]] + v[i])

2. 完全背包问题

物品可无限次选择,其他条件与01背包相同

dp[j] = max(dp[j], dp[j - w[i]] + v[i])

代码实现

dp = [0] * (V + 1)
for i in range(1, N+1):
    for j in range(w[i], V+1):  # 正序遍历
        dp[j] = max(dp[j], dp[j - w[i]] + v[i])

3. 多重背包问题

优化方法

  • 二进制拆分:将C_i分解为1,2,4,...的二进制组合,转化为01背包问题。
  • 单调队列优化:利用滑动窗口思想优化状态转移。
# 拆分物品
new_w, new_v = [], []
for i in range(N):
    k = 1
    while k <= C[i]:
        new_w.append(w[i] * k)
        new_v.append(v[i] * k)
        C[i] -= k
        k *= 2
    if C[i] > 0:
        new_w.append(w[i] * C[i])
        new_v.append(v[i] * C[i])

# 转化为01背包
dp = [0] * (V + 1)
for i in range(len(new_w)):
    for j in range(V, new_w[i]-1, -1):
        dp[j] = max(dp[j], dp[j - new_w[i]] + new_v[i])

 

相关文章:

  • vue,vue3 keepalive没有效果,无法缓存页面include无效,keep-alive
  • 【Git】五、多人协作
  • 鸿蒙-自定义相机拍照
  • 了解string
  • Apache Spark 的主要特点
  • 工厂车辆排队系统
  • 关于解决springcloud 创建bean失败的问题
  • 【python】解析自动化脚本文件并按照=测试周期=存储记录
  • react hook useReducer
  • 如何解决服务器被黑客爬虫攻击:全面防护与优化策略
  • Android TabLayout 实现随意控制item之间的间距
  • rk3588/3576板端编译程序无法运行视频推理
  • vue-element-admin 打包部署到SpringBoot
  • Linux Python 调试/堵塞/性能分析与定位工具
  • 【Cesium学习(十三)】Cesium学习主要优秀资源资料总结
  • python用 PythonNet 从 Python 调用 WPF 类库 UI 用XAML
  • 支持向量机 (Support Vector Machine, SVM)
  • ProfiNet转EtherNet/IP罗克韦尔PLC与监控系统通讯案例
  • hydra docker版本
  • 云原生监控体系建设:Kubernetes架构下的全面监控策略
  • 中国旅游日|上天当个“显眼包”!体验低空经济的“飞”凡魅力
  • 韩正会见美国景顺集团董事会主席瓦格纳
  • 人民日报整版聚焦:外贸产品拓内销提速增量,多地加快推动内外贸一体化
  • 农行再回应客户办理业务期间离世:亲属连续三次输错密码,理解亲属悲痛,将协助做好善后
  • 上海“城市文明开放麦”全城总动员,樊振东担任首位上海城市文明大使
  • 光明日报:家长孩子共同“息屏”,也要保证高质量陪伴