背包问题详解

本文深入解析背包问题,包括部分背包、01背包、完全背包和多重背包。介绍了各种背包的定义、分析及代码实现,强调动态规划和贪心算法在解决这些问题中的应用,并通过实例说明了状态转移方程和代码实现过程。
摘要由CSDN通过智能技术生成

导言

部分背包问题

0 1 背包问题

完全背包问题

多重背包问题

背包的分类

一级包,二级包和三级包,显然其中三级包的容量是最大的,吃鸡必备装备啊!
这里写图片描述

但是我们需要研究的是这样的问题:
这里写图片描述

各种背包

背包问题大概分下面这几种

  • 部分背包问题
  • 0 1 背包问题
  • 完全背包问题
  • 多重背包问题
问题

为什么要学习背包问题呢?

  • 背包问题已经是一个很经典而且讨论很广泛的算法问题了。
  • 背包问题的解决方法背后其实隐藏了两种我们比较常见的算
    法解决思路,动态规划和贪心算法。

部分背包

定义:

部分背包问题:
给出 n 个物体,第 i 个物体重量为 wi, 价值为 vi。在总重量
不超过 W 的情况下让总价值尽量高,每一个物体都可以只取走
一部分,价值和重量按比例计算。
分析
因为物体既有重量又有价值,所以不能简单的先拿轻的 (轻
的可能价值也小),也能先拿价值大的 (它可能特别重),而因该
综合考虑两个因素。一种直观的贪心策略就是:优先拿“价值除
以重量”最大的,直到重量和正好为 W

那么你作为一个非常优秀的 ACMer,肯定应该知道按照什
么顺序拿物品的把。没错,看着值钱的先抢!

那么问题很简单咯 ,把” 值钱” 的东西排在前面,每次拿抢
的时候,问问看背包君够不够承受得住,承受的了,就全部抢过
来。承受不住,那么只能按照所能承受的重量,取物品的一部分
了。当然价值也得按照比例来哦

部分背包没什么好讲的,主要是一个贪心策略,就是优先选取性价比最高的来装入背包


01背包

0 1 背包问题:

有 n 种重量和价值分别为 wi ,vi 的物品,从这些物品中挑选
总重量不超过 W 的物品,求出挑选物品价值总和的最大值。在
这里,每种物品只可以挑选一件
限制条件
  • 1n100 1 ≤ n ≤ 100
  • 1wi;vi100 1 ≤ w i ; v i ≤ 100
  • 1W10000 1 ≤ W ≤ 10000
分析一下

01 这 道 题 就 是 各 个 物 品 “ 选 ” 与 “ 不 选 ” 的 组 合 , 因 此 被 称 为 0 − 1 背 包 问 题 n 如 果 检 查 n 个 物 品 所 有 “ 选 ” 与 “ 不 选 ” 的 组 合
O(2n) 算 法 的 复 杂 度 为 O ( 2 n ) 当 物 品 的 大 小 以 及 背 包 的 大 小 均 为 正 数
01O(nW) 则 0 − 1 背 包 问 题 可 以 用 动 态 规 划 法 以 O ( n W ) 的 效 率 解 决 。

状态转移方程:

i 如 果 我 们 按 照 如 下 的 方 式 来 定 义 递 推 关 系 的 话 , 刚 刚 关 于 i 的 循 环 就 能 正 向 进 行
dp[i+1][j]:=0ii+1 j  我 们 定 义 d p [ i + 1 ] [ j ] := 从 0 到 i 这 i + 1 个 物 品 中 选 出 总 重 量 不 超 过   j   的 物 品 时 总 价 值 的 最 大 值
dp[0][j]=00 很 显 然 d p [ 0 ] [ j ] = 0 , 因 为 你 没 物 品 可 取 的 时 候 背 包 的 价 值 为 0

所以我们可以写出下边的状态转移方程

dp[i+1][j]={ dp[i][j]max(dp[i][j],dp[i][jw[i]]+v[i])(j<w[i])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值