完全背包问题
来源:互联网 发布:手机自动作曲软件 编辑:程序博客网 时间:2024/06/05 20:12
一个资深小白的理解~~
引用最常见的问题:有N种物品和一个容量为V的背包,每种物品都有无限件可用。第i种物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。与01背包不同的是每种物品可以取多次,
01背包的状态方程是f[i][j]=max(f[i-1][j],f[i-1][j-w[i]]+v[i];
完全背包的状态方程是f[i][j]=max{f[i-1][j-k*w[i]]+k*v[i]|0<=k*c[i]<=j}可见,当k=0和1时就是01背包的状态方程。
对于这个状态方程需要关于i,j,k的三重循环。
关于优化问题:化简状态方程f[i][j]=max{f[i-1][j-k*w[i]]+k*v[i]|0<=k*w[i]<=j}
=max(f[i-1][j],max{f[i-1][j-k*w[i]]+k*v[i]|k>=1})=max(f[i-1][j],f[i][j-w[i]]+v[i])
若两件物品满足C[i] ≤C[j]&&W[i] ≥W[j]时将第j种物品直接筛选掉。因为第i种物品比第j种物品物美价廉,用i替换j得到至少不会更差的方案。
这个筛选过程如下:先找出体积大于背包的物品直接筛掉一部分(也可能一种都筛不掉)复杂度O(N)。利用计数排序思想对剩下的物品体积进行
排序,同时筛选出同体积且价值最大的物品留下,其余的都筛掉(这也可能一件都筛不掉)复杂度O(V)。
整个过程时间复杂度为O(N+V)时间复杂度优化为O(NV)
设F[i][j]表示出在前i种物品中选取若干件物品放入容量为j的背包所得的最大价值。那么对于第i种物品的出现,我们对第i种物品放不放入背包
进行决策。如果不放那么F[i][j]=F[i-1][j];如果确定放,背包中应该出现至少一件第i种物品,所以F[i][j]种至少应该出现一件第i种物品,
即F[i][j]=F[i][j-C[i]]+W[i]。为什么会是F[i][j-C[i]]+W[i]?因为我们前面已经最大限度的放了第i件物品,如果能放就放这最后的一件,
(或者理解为前面已经往背包中放入了第i件物品,我们每一次只增加一件的往背包里放,而且只能增加一件,多了放不下)
状态方程为:
关于空间优化 稍后再补
- 背包问题-完全背包-背包问题
- 01背包 完全背包问题
- 背包问题2:完全背包
- 01背包+完全背包问题
- nyoj311完全背包(完全背包问题)
- 完全背包问题
- 完全背包问题
- 完全背包问题
- 完全背包问题
- 完全背包问题
- P02: 完全背包问题
- 完全背包问题、、、
- P02: 完全背包问题
- 完全背包问题
- P02: 完全背包问题
- 完全背包问题
- P02: 完全背包问题
- 完全背包问题总结
- 数据库的命令行管理脚本
- 【并查集/离散化】洛谷P1955 程序自动分析
- Raft一致性算法论文的中文翻译
- 快速建站教程
- UGUI相册
- 完全背包问题
- redis--RDB持久化--AOF持久化
- HDU 6119 小小粉丝度度熊(尺取)
- Oracle性能优化读书笔记(3)-Oracle表分区技术
- $.cookie( ) 用法详细解析
- Struts2的配置问题
- angular ng-model 中接收后台的时间戳格式化
- ubuntu 环境变量配置
- 图像处理之霍夫变换圆检测算法