背包总结

作者: Claire_cc | 来源:发表于2018-12-06 23:03 被阅读17次

    1. 01背包

    问题描述:有n件物品,每件物品的重量为w[i],价值为c[i],现有容量为V的背包,如何放入使背包的总价值最大。
    解:dp[i][v]表示第i件物品恰好放入容量为v的背包中所能获得的最大值
    dp[i][v]=max{dp[i-1][v],dp[i-1][v-w[i]]+c[i]}(1<=i<=n,w[i]<=v<=V)
    边界dp[0][v]=0
    实现:因为dp[i][v]只和dp[i-1][v]的状态有关,所以可以用1*V的数组表示每一轮的dp值,i从1到n,v从V到w[i]
    剪枝优化:dp[V]=V的时候退出

    for(int i=1;i<=n;i++)
      for(int v=V;v>=w[I];v--)
          dp[v]=max(dp[v],dp[v-w[i]]+c[i]);
    例题:洛谷P2639
    

    2.完全背包
    问题描述:每个物品都有无限件

    for(int i=1;i<=n;i++)
      for(int v=w[I];v<=V;v--)
          dp[v]=max(dp[v],dp[v-w[i]]+c[i]);
    

    3.多重背包
    问题描述:每种物品都有有限个数量
    :可以看成是多个有着相同价值和重量的物品,转化成01背包

    相关文章

      网友评论

        本文标题:背包总结

        本文链接:https://www.haomeiwen.com/subject/zkoiqqtx.html