动态规划——背包问题
在写博客之前,先列出两个背包九讲链接以供参考 yxc在B站上讲的背包九讲: 背包九讲专题 以及一篇非常经典的 dd大牛的《背包九讲》 0 1背包问题 完全背包问题 多重背包问题 分组背包问题 0 1背包问题 有N件物品和一个容量为V的背包。第i件物品的费用是c[i](本题里是v[i]),价值是w[i]。 这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。 在求状态转移方程的方面,思路是集合划分: f(i,j):“在i个东西里面选质量为j的东西的总商品价值”这一集合可分为“选的所有东西里面 不包含i ”和“选的东西里面 包含i ”两种情况。 的话 不含i的情况即是f(i-1,j)【在i-1个东西中选质量为j的东西】 含i的情况即是f(i-1,j-V i )+w i 【由于选了i,那就是在i-1个东西中选j-V i 质量的总价值加上i的价值】 将上述两个集合取价值最大的取法,即为“在i个东西里面选质量为j的东西的总商品价值” 优化1:减少操作次数 由于上述的情况中,含i的情况是不一定存在的(那是当背包最大重量j<V i 即装不下的时候不需要考虑) 优化2:将二维数组优化为滚动数组 滚动数组:如果f(i)的计算仅仅只用了f(i-1)来完成计算的话,就只需要开一个f[2][N]的数组即可(可以运用e=1-e来实现滚动) 值得注意的是