背包总结

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背包

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 01 阅读《象与骑象人》,让我重新开始思考一些重要的问题,这些问题或许因为过于“重要”而显得有些老生常谈。 也因为...
    杨摩阅读 2,607评论 1 7
  • 郭相麟 某天晚上人们路过一广场,听到音乐响起,原来是一个二十多岁的年轻人在开“马路演唱会"! 在演唱会上,广...
    郭相麟阅读 2,463评论 0 0
  • 写在前面 面试真是让人头疼的事情。 这是一篇关于网络编程的相关概念的文章,全文不涉及代码,只对一些名词进行简单解释...
    one1go阅读 2,642评论 0 1