01背包问题

来源:互联网 发布:大数据平台性能指标 编辑:程序博客网 时间:2024/06/10 16:01

  动态规划中很经典的问题,去年暑假集训的时候看过,下午又遇到了这种类型的题目,发现什么都不懂了,又翻看了之前的资料,就是陷入了一个坑里了,不明白对空间进行优化的要采用逆序,足足三个小时啊。。。我是不是太笨了???不过还好,终于理解了,我想应该也有不少童鞋跟我一样,就用自己的理解方式拿出来共享下

 

      首先我们看未进行优化的时候的动态规划方程的推导过程。01背包是指有N件物品和一个容量为V的背包,每件物品只有一件,所占用的空间为cost[i],花费为w[i],求将这些物品放入背包中所能获得的最大的价值。

      假设dp[i][v]表示第i件物品放入背包时获得的最大的价值,每件物品都可以选择放或者不放,故动态规划方程可以列成:dp[i][v]=max{dp[i-1][v],dp[i-1][v-cost[i]+w[i]} ,意思就是第I件物品不放 进去的总价值为dp[i-1][v],放进去的价值为dp[i-1][v-cost[i]]+w[i],比较两种情况下的最优解。

      即对每件物品进行考虑,

         for(i->n)

            for(0->v)

                 dp[i][v]=max{dp[i-1][v],dp[i-1][v-cost[i]+w[i]};

      考虑到空间可以从二维数组降低到一位数组,用dp[v]表示前i件物品放入背包的最大价值。i=0->n循环后dp[v]表示的就是最优解。

   那么方程可表示为

    dp[v]=max{dp[v],dp[v-cost[i]]+w[i]},

   那么dp[v]怎么才能表示前一个状态的值呢?逆序,for(v->0),为什么?考虑到价值均为正值,体积大的时候的解是依赖于体积小的解的,而且每个物品只能放置一次,假设v1<v2,如果顺序循环的话,就会出现当更新dp[v2]时,加入了物品i,然后才循环到体积v2,就可能出现dp[v2]也会因为i加入出现更新,也就是在这个过程中i加入了两次,与01背包不符。逆序的话,当dp[v2]更新的时候dp[v1]还未出现更新,这时方程中后一个dp[v]就可以看成dp[i-1][v]了,dp[v]在优化后也就可以表示前一个状态了(体积小的)。

 

     关于初始化问题的时候要考虑如下两种方式:

     (1)刚好完全填满背包

           这就要求当容量为0的时候,只能被价值为0的物品填满,即初始化为dp[0]=0;

     (2)不要求刚好填满

           也就是每一个体积的情况下都有一个有效解为0,所以初始化为dp[0...v]=0.

原创粉丝点击