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

C++01背包问题

一、01背包

概念:

给你一个容量为C的背包,有n个物品。每个物体都有两个属性,即重量(w)和价值(v)。如果背包剩余容量大于此物品的重量,即可放入,同时产生这个物品的价值。
问:如何将物体放入背包才能使放入物体的总价值最大,同时输出这个值?

为何不用贪心?

证明:

看到这个问题,你可能会想到使用贪心,我来反驳一下:

01 背包中,物品只能完整选择,选择某物品会占用背包空间,可能导致无法选择其他更有价值的物品组合。此时,贪心算法的 “局部最优”可能会排斥掉更优的全局组合。

举个反例:
背包最大承重为5,有3个物品,物品如下:

物品重量价值性价比(≈)
A451.25
B341.33
C341.33

贪心(按单位价值排序): 先选择 B 或 C,无法容纳其他物品,总价值是4。

最优解:选择A,总价值为5。

科普:

有一种背包叫做分数背包问题,可以把某一种物品分割放入背包中,这时你就可以利用这种贪心方法。

dp做法:

1. 状态定义

设 dp[i][j] 表示:考虑前 i 个物品(编号从 1 到 i),且背包承重上限为 j 时,能获得的最大总价值

  • 其中,i 的范围是 0 ≤ i ≤ ni=0 表示无物品);
  • j 的范围是 0 ≤ j ≤ Cj=0 表示背包承重为 0)。
2. 初始化
  • 当 i=0(无物品)时,无论背包承重 j 多大,总价值均为 0,即 dp[0][j] = 00 ≤ j ≤ C)。
  • 当 j=0(背包承重为 0)时,无论考虑多少物品,总价值均为 0,即 dp[i][0] = 00 ≤ i ≤ n)。
3. 转移方程

对于第 i 个物品(重量 w[i],价值 v[i]),有两种选择:

  • 不放入:此时总价值与 “考虑前 i-1 个物品、承重 j” 的情况相同,即 dp[i][j] = dp[i-1][j]
  • 放入(需满足 j ≥ w[i]):此时总价值为 “前 i-1 个物品在承重 j - w[i] 时的最大价值” 加上当前物品的价值,即 dp[i][j] = dp[i-1][j - w[i]] + v[i]

因此,转移方程为:

if (j < w[i]) dp[i][j] = dp[i-1][j];
else dp[i][j] = max(dp[i-1][j], dp[i-1][j - w[i]] + v[i]);
4. 最终答案

考虑所有 n 个物品,且背包承重为 C 时的最大价值,即 dp[n][C]

5. 时间复杂度与空间复杂度
  • 时间复杂度O(n*C),其中 n 是物品数量,C 是背包最大承重。需遍历 n*C 个状态,每个状态的计算为 O(1)
  • 空间复杂度
    • 原始二维数组:O(n*C)(存储 n+1 行、C+1 列的状态)。
http://www.lqws.cn/news/543889.html

相关文章:

  • 汇总表支持表头分组,查询组件查询框可以调整高度,DataEase开源BI工具v2.10.11 LTS版本发布
  • ESP32 008 MicroPython Web框架库 Microdot 实现的网络文件服务器
  • A Machine Learning Approach for Non-blind Image Deconvolution论文阅读
  • 金蝶云星空客户端自定义控件插件-WPF实现自定义控件
  • 电磁波是如何传递信息的?
  • 鸿蒙 List 组件解析:从基础列表到高性能界面开发指南
  • 前端 E2E 测试实践:打造稳定 Web 应用的利器!
  • 海外 AI 部署:中国出海企业如何选择稳定、安全的云 GPU 基础设施?
  • 扬州搓澡非遗解码:三把刀文化的“水包皮“
  • 010 【入门】链表入门题目-合并两个有序链表
  • Linux驱动学习day9(异常与中断处理)
  • 华为云Flexus+DeepSeek征文|基于Dify构建故事绘本制作工作流
  • Spark 写入hive表解析
  • Spring Boot项目开发实战销售管理系统——系统设计!
  • 知名流体控制解决方案供应商“永盛科技”与商派ShopeX达成B2B商城项目合作
  • iOS 远程调试与离线排查实战:构建非现场问题复现机制
  • 报道称CoreWeave洽谈收购Core Scientific,后者涨超30%
  • NV025NV033美光固态闪存NV038NV040
  • 《二分枚举答案(配合数据结构)》题集
  • Python Selenium 滚动到特定元素
  • Selenium基本用法
  • Spring Boot 性能优化与最佳实践
  • 6.27_JAVA_面试(被抽到了)
  • 洛谷P5021 [NOIP 2018 提高组] 赛道修建
  • 深入理解 Linux `poll` 模型:`select` 的增强版
  • 记录一次飞书文档转md嵌入vitepress做静态站点
  • 微信小程序进度条progress支持渐变色
  • Stable Diffusion入门-ControlNet 深入理解-第三课:结构类模型大揭秘——深度、分割与法线贴图
  • 【LeetCode 热题 100】42. 接雨水——(解法三)单调栈
  • FPGA在嵌入式图像处理中的深度应用!