背包总结

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了背包总结相关的知识,希望对你有一定的参考价值。

0/1背包

题意

给一个体积为V的背包,n件物品,每件物品的价值为c[i],体积为v[i],问不超过背包体积可以装的最大价值为多少

分析

定义:dp[i][v]:考虑到第i件物品,体积为V(V >= v[i])时的最大价值

转移:dp[i][v] = max(dp[i-1][v],dp[i-1][v-v[i]] + c[i])

从转移方程可以看出 dp[v] = max(dp[v], dp[v-a[i]] + c[i])  (需要逆序枚举V!!!)


 

完全背包

题意

给一个体积为V的背包,n件物品,每件物品的价值为c[i],体积为v[i],问不超过背包体积可以装的最大价值为多少

分析

不难看出与0/1背包的区别在于每件物品的数量上,考虑二进制拆分优化

直接正序枚举v即可(与0/1背包相反)


 分组背包

题意

给一个体积为V的背包,n件物品,每件物品有a[i]个,价值为c[i],体积为v[i],问不超过背包体积可以装的最大价值为多少

分析

考虑二进制拆分 将a[i] 拆成 : 1,2,4 ...... 2^k,a[i] - 2^(k+1) + 1 共k+1件物品 

技术分享图片
    for(int i = 1; i <= n ; i++)
    {
        for(int k = 1; k < a[i]; a[i]-=k, k<<1)
        {
            for(int j = V; j >= k*c[i]; --j)
            {
                dp[j] = max(dp[j], dp[j-k*v[i] + k*c[i]);
            }
        }
        for(int j = V; j >= a[i]*c[i]; --j)
             dp[j] = max(dp[j], dp[j-a[i]*v[i]]+a[i]*c[i])
    }
View Code

 


以上是关于背包总结的主要内容,如果未能解决你的问题,请参考以下文章

总结背包问题的至多/恰好/至少

动态规划背包问题总结:01完全多重与其二进制优化分组背包 题解与模板

如何完成活动? (喷气背包导航)

算法刷题总结

算法刷题总结

算法刷题总结