动态规划-背包问题专题
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
区别:第 i 件物品可以无限装, 01 背包只能装一 次 其中0<=k*w[i]<=v
for i=1..n for v=0..v f[i][v]=max{f[i-1][v],f[i-1][v-w[i]]+c[i]}
转换:f[v]=max{f[v],f[v-k*w[i]]+k*c[i]}
01背包与完全背包对比
混合背包问题:
其实是将多种背包问题混在一起,无需多讲,在 循环时根据不同的背包类型进行不同的处理即可 ,此处不再赘述。
二维费用背包问题:
同上,加多一维数组即可。
状态转移方程:
f[i][v][u]=max{f[i-1][v][u],f[i-1][v-a[i]][u-b[i]]+w[i]}
01背包
有 N 件物品和一个容量为 V 的背包。第 i 件物品的 费用是c[i],价值是w[i]。求解将哪些物品装入背 包可使这些物品的费用总和不超过背包容量,且 价值总和最大。
基本思路:对于第i件物品,我们有两个选择:放 或者不放,用f[i][v]表示前i件物品恰放入容量为v 的最大价值,于是有两种情况:
不放:f[i][v]=f[i-1][v] 放: f[i][v]=f[i-1][v-c[i]]+w[i]
1. 2.
最后取这两者的最大值
于是得出状态转移方程:
f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}
边界:f[1][0]=0(不装任何东西)
核心代码:
数据:
f[1] 0 f[2] 1 f[3] 3 f[4] 5 f[5] 5 f[6] 6 f[7] 9 f[8] 9 f[9] 10 f[10] 12
10 4
重量 价值 求得: 21 33 45 79
完全背包问题
有N种物品和一个容量为V的背包,每种物品都有 无限件可用。第i种物品的费用是c[i],价值是w[i] 。求解将哪些物品装入背包可使这些物品的费用 总和不超过背包容量,且价值总和最大。
for v=v..0
for i=1..n f[i][v]=max{f[i-1][v],f[i-1][vw[i]]+c[i]}
时空分析及优化
以上方法的时间和空间复杂度均为O(N*V),其中 时间复杂度基本已经不能再优化了,但空间复杂 度却可以优化到O(V)。
f[i][v]->f[v] ‘f[v]表示重量不超过V公斤的最大价值
更高级的东西
泛化问题 求最优方案总数
建议认真阅读“背包九讲”这篇神东西。
分组背包问题(同组互斥)
使用一维数组的伪代码如下: for v=V..0
for 所有的i属于组k f[v]=max{f[v],f[v-c[i]]+w[i]}
for 所有的组k
有依赖背包问题(同组依赖)
这种背包问题的物品间存在某种“依赖”的关系 。也就是说,i依赖于j,表示若选物品 i,则必须 选物品j。为了简化起见,我们先设没有某个物品 既依赖于别的物品,又被别的物品所依赖;另外 ,没有某件物品同时依赖多件物品。
动态规划 - 背包问题及其变形
长沙市一中 曹毅
回顾:动态规划的核心要素
基本概念:
阶段 状态 状态转移方程
1. 2. 3.
使用条件:
最优子结构 无后效性
1. 2.
背包问题:
01背包问题
完全背包问题
多重背包问题
混合背包问题 二维费用的背包问题 分组背包问题 有依赖背包问题
wenku.baidu.com
完全背包的优化:
1.简单优化:w[i]<=w[j] 且c[i]>=c[j]则去掉j物品 (性价比低)
2.二进制优化,核心思想:将第i种物品拆成若干 个物品,其中每件物品有一个系数,这件物品的 费用和价值均是原来的费用和价值乘以这个系数 。 使 这 些 系 数 分 别 为 1,2,4,...,2^(k-1),n[i]2^k+1 ,且 k 是满足 n[i]-2^k+1>0 的最大整数。 例如,如果 n[i] 为 13 ,就将这种物品分成系数分 别为 1,2,4,6 的四件物品。目的还是转换为 01 背 包问题。
分组背包问题(同组互斥)
有 N 件物品和一个容量为 V 的背包。第 i 件物品的 费用是c[i],价值是w[i]。这些物品被划分为若干 组,每组中的物品互相冲突,最多选一件。求解 将哪些物品装入背包可使这些物品的费用总和不 超过背包容量,且价值总和最大。
分析:这个问题变成了每组物品有若干种策略: 是选择本组的某一件,还是一件都不选。也就是 说设 f[k][v] 表示前 k 组物品花费费用 v 能取得的最 大 权 值 , 则 有 f[k][v]=max{f[k-1][v],f[k-1][vc[i]]+w[i]| 物品 i 属于第 k 组 } 。(以组为单位进行 枚举)
多重背包问题:
有 N 种物品和一个容量为 V 的背包。第 i 种物品最 多有 n[i] 件可用,每件费用是 c[i] ,价值是 w[i] 。 求解将哪些物品装入背包可使这些物品的费用总 和不超过背包容量,且价值总和最大。
分析:类似完全背包,k的取值范围有所变化 f[i][v]=max{f[i-1][v-k*c[i]]+ k*w[i]|0<=k<=n[i]} 。复杂度是O(V*∑n[i])
数据:
10 4 重量 价值 求得:
01背包
完全背包
2
3 4 7
1
3 5 9
f[1] 0
f[2] 1 f[3] 3
f[1] 0 f[2] 1 f[3] 3 f[4] 5 f[5] 5 f[6] 6 f[7] 9 f[8] 10 f[9] 10 f[10] 12
f[4] 5
f[5] 5 f[6] 6 f[7] 9 f[8] 9 f[9] 10 f[10] 12
将不依赖于别的物品的物品称为“主件”,依赖 于某主件的物品称为“附件”。于是抽象会形成 一颗树!!(树形DP)
解决方案:
1. 每个主件里的物品可选可不选,于是在主件内 部又存在一个01背包问题。
2.将主件内物品进行一次01背包,于是主件间的 关系形成了类似分组背包问题,即可用分组背包 解决。
for i=1..n for v=0..v f[i][v]=max{f[i-1][v],f[i-1][v-w[i]]+c[i]}
转换:f[v]=max{f[v],f[v-k*w[i]]+k*c[i]}
01背包与完全背包对比
混合背包问题:
其实是将多种背包问题混在一起,无需多讲,在 循环时根据不同的背包类型进行不同的处理即可 ,此处不再赘述。
二维费用背包问题:
同上,加多一维数组即可。
状态转移方程:
f[i][v][u]=max{f[i-1][v][u],f[i-1][v-a[i]][u-b[i]]+w[i]}
01背包
有 N 件物品和一个容量为 V 的背包。第 i 件物品的 费用是c[i],价值是w[i]。求解将哪些物品装入背 包可使这些物品的费用总和不超过背包容量,且 价值总和最大。
基本思路:对于第i件物品,我们有两个选择:放 或者不放,用f[i][v]表示前i件物品恰放入容量为v 的最大价值,于是有两种情况:
不放:f[i][v]=f[i-1][v] 放: f[i][v]=f[i-1][v-c[i]]+w[i]
1. 2.
最后取这两者的最大值
于是得出状态转移方程:
f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}
边界:f[1][0]=0(不装任何东西)
核心代码:
数据:
f[1] 0 f[2] 1 f[3] 3 f[4] 5 f[5] 5 f[6] 6 f[7] 9 f[8] 9 f[9] 10 f[10] 12
10 4
重量 价值 求得: 21 33 45 79
完全背包问题
有N种物品和一个容量为V的背包,每种物品都有 无限件可用。第i种物品的费用是c[i],价值是w[i] 。求解将哪些物品装入背包可使这些物品的费用 总和不超过背包容量,且价值总和最大。
for v=v..0
for i=1..n f[i][v]=max{f[i-1][v],f[i-1][vw[i]]+c[i]}
时空分析及优化
以上方法的时间和空间复杂度均为O(N*V),其中 时间复杂度基本已经不能再优化了,但空间复杂 度却可以优化到O(V)。
f[i][v]->f[v] ‘f[v]表示重量不超过V公斤的最大价值
更高级的东西
泛化问题 求最优方案总数
建议认真阅读“背包九讲”这篇神东西。
分组背包问题(同组互斥)
使用一维数组的伪代码如下: for v=V..0
for 所有的i属于组k f[v]=max{f[v],f[v-c[i]]+w[i]}
for 所有的组k
有依赖背包问题(同组依赖)
这种背包问题的物品间存在某种“依赖”的关系 。也就是说,i依赖于j,表示若选物品 i,则必须 选物品j。为了简化起见,我们先设没有某个物品 既依赖于别的物品,又被别的物品所依赖;另外 ,没有某件物品同时依赖多件物品。
动态规划 - 背包问题及其变形
长沙市一中 曹毅
回顾:动态规划的核心要素
基本概念:
阶段 状态 状态转移方程
1. 2. 3.
使用条件:
最优子结构 无后效性
1. 2.
背包问题:
01背包问题
完全背包问题
多重背包问题
混合背包问题 二维费用的背包问题 分组背包问题 有依赖背包问题
wenku.baidu.com
完全背包的优化:
1.简单优化:w[i]<=w[j] 且c[i]>=c[j]则去掉j物品 (性价比低)
2.二进制优化,核心思想:将第i种物品拆成若干 个物品,其中每件物品有一个系数,这件物品的 费用和价值均是原来的费用和价值乘以这个系数 。 使 这 些 系 数 分 别 为 1,2,4,...,2^(k-1),n[i]2^k+1 ,且 k 是满足 n[i]-2^k+1>0 的最大整数。 例如,如果 n[i] 为 13 ,就将这种物品分成系数分 别为 1,2,4,6 的四件物品。目的还是转换为 01 背 包问题。
分组背包问题(同组互斥)
有 N 件物品和一个容量为 V 的背包。第 i 件物品的 费用是c[i],价值是w[i]。这些物品被划分为若干 组,每组中的物品互相冲突,最多选一件。求解 将哪些物品装入背包可使这些物品的费用总和不 超过背包容量,且价值总和最大。
分析:这个问题变成了每组物品有若干种策略: 是选择本组的某一件,还是一件都不选。也就是 说设 f[k][v] 表示前 k 组物品花费费用 v 能取得的最 大 权 值 , 则 有 f[k][v]=max{f[k-1][v],f[k-1][vc[i]]+w[i]| 物品 i 属于第 k 组 } 。(以组为单位进行 枚举)
多重背包问题:
有 N 种物品和一个容量为 V 的背包。第 i 种物品最 多有 n[i] 件可用,每件费用是 c[i] ,价值是 w[i] 。 求解将哪些物品装入背包可使这些物品的费用总 和不超过背包容量,且价值总和最大。
分析:类似完全背包,k的取值范围有所变化 f[i][v]=max{f[i-1][v-k*c[i]]+ k*w[i]|0<=k<=n[i]} 。复杂度是O(V*∑n[i])
数据:
10 4 重量 价值 求得:
01背包
完全背包
2
3 4 7
1
3 5 9
f[1] 0
f[2] 1 f[3] 3
f[1] 0 f[2] 1 f[3] 3 f[4] 5 f[5] 5 f[6] 6 f[7] 9 f[8] 10 f[9] 10 f[10] 12
f[4] 5
f[5] 5 f[6] 6 f[7] 9 f[8] 9 f[9] 10 f[10] 12
将不依赖于别的物品的物品称为“主件”,依赖 于某主件的物品称为“附件”。于是抽象会形成 一颗树!!(树形DP)
解决方案:
1. 每个主件里的物品可选可不选,于是在主件内 部又存在一个01背包问题。
2.将主件内物品进行一次01背包,于是主件间的 关系形成了类似分组背包问题,即可用分组背包 解决。