01背包原理

简介: 笔记

01背包


每件物品只有一个

状态表示:f[i][j] 表示所有只从前 i 个物品中选 且总体积不超过 j 的选法的价值最大值


朴素算法

分为两种情况:①不选第i个物品f[i−1][j]


②选第i个物品 状态方程可以由f[i−1][j−v]+w得到f[i−1][j−v]+w表示前i−1个物品取总体积不超过j−v的最大价值加上第i 个物品的价值(v , w )分别表示第i个物品的体积和价值

for (int i = 1;i <= n;++i) {
  for (int j = 0;j <= m;++j) {
    f[i][j] = f[i - 1][j];
    if (j >= v[i])f[i][j] = max(f[i][j], f[i - 1][j - v[i]] + w[i]);
  }
}
cout << f[n][m] << endl;


优化成一维

因为对第i维的判断只用到了i−1维,所以可以用滚动数组的思想 由朴素的算法可知i ii维都是由i−1维转移过来的 如果对j从小到大枚举 计算到f[j]时 此时的f[j−v[i]]小于f[j]已经被更新到第i 维 所以要对j从大到小枚举

for (int i = 1;i <= n;++i) {
  for (int j = m;j >= v[i];--j) {
    f[j] = max(f[j], f[j - v[i]] + w[i]);
  }
}


目录
相关文章
|
6月前
|
算法 Windows
class073 背包dp-01背包、有依赖的背包【算法】
class073 背包dp-01背包、有依赖的背包【算法】
53 0
|
1月前
|
算法 决策智能
初谈背包问题——01背包
初谈背包问题——01背包
|
4月前
|
算法 搜索推荐 Java
解析01背包问题及其在动态规划中的应用
解析01背包问题及其在动态规划中的应用
|
6月前
|
算法 Java
用Java实现01背包问题 用贪心算法
用Java实现01背包问题 用贪心算法
145 43
|
11月前
动态规划入门01背包
基本思路: 1.n物品个数,m为背包体积,使用w[i]记录权值,v[i]记录体积,f[i][j]记录选择前i个物体,在不超过j体积下的最优解 最终答案就是f[n][m]; 2.f[i][j]的状态依赖于之前的状态;即f[i[][j]依赖于f[i - 1][j]的状态;也可以理解为所有的状态由f[0][j]推得 f[i][j]的状态不好算出来,但是f[0][j]的状态必定为0,由f[0][j]可以算出f[1][j]的,由f[1][j]又可算出f[2][j]的递推可得出全部。f[1][1] f[2][2] f[3][3]他们每个都减去第i个物品的权值最大值仍不变,最后在加上w[i]即可 即( f[
59 0
|
人工智能 算法 决策智能
动态规划之背包问题(01背包问题、完全背包问题、方案数填满型背包问题)
动态规划之背包问题(01背包问题、完全背包问题、方案数填满型背包问题)
241 1
可能你已经刷了很多01背包的题,但是真的对01背包领悟透彻了吗?,看我这一篇,使君对01背包的理解更进一步【代码+图解+文字描述】
可能你已经刷了很多01背包的题,但是真的对01背包领悟透彻了吗?,看我这一篇,使君对01背包的理解更进一步【代码+图解+文字描述】
|
测试技术 容器
动态规划之背包问题——背包三讲(01背包,完全背包,多重背包)(三)
动态规划之背包问题——背包三讲(01背包,完全背包,多重背包)(三)
210 0
动态规划之背包问题——背包三讲(01背包,完全背包,多重背包)(三)
|
算法 C++
|
测试技术
动态规划之背包问题——背包三讲(01背包,完全背包,多重背包)(二)
动态规划之背包问题——背包三讲(01背包,完全背包,多重背包)(二)
285 0
动态规划之背包问题——背包三讲(01背包,完全背包,多重背包)(二)