DP之背包学习记录(一)

来源:互联网 发布:照片视频软件 编辑:程序博客网 时间:2024/06/04 08:30

昨天看了01背包,完全背包,和多重背包这三个问题,然后呢,01和完全的区别在于顺序还是倒序.今天偷点懒,写完解题报告就滚床睡,,刚才看到了WHUD大牛的博客,好棒,真的好棒,自己要加油啦,在2015年希望有个质的飞越。

背包问题是DP问题的一个分支,所有背包问题呢,都是可以划分到01背包这个最简单基础的背包问题上,然后呢,我们要尽量类背包问题转化到01背包问题····

我们先说说01背包

   N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。

对于这个问题呢,我们需要考虑的是放或者不放,这个才是最重要,所以不难有状态转移方程 dp[i][v] = max(dp[i-1][v],dp[i-1][v-c[i]]+w[i])

dp[i][v]表达的是第i件物品放入容积v中的价值,这个状态转移方程就两个方向,放还是不放,如果不放第i件物品的话,就应该是dp[i-1][v],也就是与i-1件物品放入容量v中的价值与放第i件商品,转化为i-1件物品放入剩下的容量为v-c[i]的背包中的价值比较。

这个复杂度已经无法优化,但是空间我们还是可以继续优化的

       for(int i = 1;i<=n;i++)物品种类
       {
           for(int j = V;j>=c[i];j--)费用
           {
               dp[j] = max(dp[j],dp[j-c[i]]+w[i]);求价值
           }
       }

恩,这个就差不多是01背包两种方法的解释了

为什么费用循环是要从V开始的呢

这正是为了保证每件物品只选一次,保证在考虑选入第i件物品这件策略时,依据的是一个绝无已经选入第i件物品的子结果f[i-1][v-c[i]]

  

0 0
原创粉丝点击