好像从没有系统的整理过……

【01背包】

给你n种不同的物品,每个物品有自己的重量w[i],和价值v[i],如果每个物品只能拿一次,给你容量为m的背包,怎样才能取得最大价值?

memset(dp, 0, sizeof(dp));
for(int i=0; i<n; i++){for(int j=m; j>=w[i]; j--){dp[j] = max(dp[j], dp[j-w[i]]+v[i])}
}

【完全背包】

给你n种不同的物品,每个物品有自己的重量w[i],和价值v[i],一个物品可以拿多次,给你容量为m的背包,怎样才能取得最大价值?

memset(dp, 0, sizeof(dp));
for(int i=0; i<n; i++){for(int j=w[i]; j<=m; j++){dp[j] = max(dp[j], dp[j-w[i]]+v[i])}
}

【多重背包】

给你n种不同的物品,每个物品有自己的重量w[i],和价值v[i],如果每个物品最多只能拿c[i]个,给你容量为m的背包,怎样才能取得最大价值?


int MultiKnapsack()
{int nCount = 0;memset(dp,0,sizeof(dp));for (int i = 0;i < n;i++){for (int j = w[i];j <= m;j++){nCount = min(num[i],j/w[i]);for (int k = 0;k <= nCount;k++){dp[i][j] = max(dp[i][j],dp[i - 1][j - k * w[i]] + k * v[i]);}}}return dp[n][m];
}

#include <iostream>
#include <cstring>
using namespace std;int N ;//物品个数int W;//背包容量
int Weight[110];
int Value[110] ;
int Num[110];int dp[110] ;///用f[j]表示,第i次循环后,f[j]中存储的前i件物品放入容量为j的背包可获得的最大价值void ZeroOnePack(int nWeight,int nValue)
{for (int j = W;j >= nWeight;j--){dp[j] = max(dp[j],dp[j - nWeight] + nValue);}
}void CompletePack(int nWeight,int nValue)
{for (int j = nWeight;j <= W;j++){dp[j] = max(dp[j],dp[j - nWeight] + nValue);}
}int MultiKnapsack()
{memset(dp,0,sizeof(dp));int k = 1;int nCount = 0;for (int i = 1;i <= N;i++){if (Weight[i] * Num[i] >= W){CompletePack(Weight[i],Value[i]);}else{k = 1;nCount = Num[i];while(k <= nCount){ZeroOnePack(k * Weight[i],k * Value[i]);nCount -= k;k *= 2;}ZeroOnePack(nCount * Weight[i],nCount * Value[i]);}}return dp[W];
}int main()
{cin>>N>>W;for(int i=1;i<=N;i++) cin>>Weight[i];for(int i=1;i<=N;i++) cin>>Value[i];for(int i=1;i<=N;i++) cin>>Num[i];cout<<MultiKnapsack()<<endl;return 1;
}

01背包,完全背包,多重背包相关推荐

  1. 背包问题-【01背包】【完全背包】【多重背包】【多限定条件背包】

    背包问题 给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高. 可参考https://www.cnblogs.com/-guz/p/9866118.h ...

  2. 小明打联盟 牛客(背包dp,多重背包)

    链接:https://ac.nowcoder.com/acm/problem/14553 来源:牛客网 题目描述 小明很喜欢打游戏,现在已知一个新英雄即将推出,他同样拥有四个技能,其中三个小技能的释放 ...

  3. 01背包模板、全然背包 and 多重背包(模板)

    转载请注明出处:http://blog.csdn.net/u012860063 贴一个自觉得解说不错的链接:http://www.cppblog.com/tanky-woo/archive/2010/ ...

  4. 【qduoj - 142】 多重背包(0-1背包的另类处理,dp)

    题干: ycb的ACM进阶之路 Description ycb是个天资聪颖的孩子,他的梦想是成为世界上最伟大的ACMer.为此,他想拜附近最有威望的dalao为师.dalao为了判断他的资质,给他出了 ...

  5. 01背包模板、完全背包 and 多重背包

    转载请注明出处:http://blog.csdn.net/u012860063 讲解链接:http://www.cppblog.com/tanky-woo/archive/2010/07/31/121 ...

  6. 【python】一篇讲透背包问题(01背包 完全背包 多重背包 二维费用背包)

    面对背包问题,有一个很重要的方程式:状态转移方程式 所以每一种背包问题我都会给出状态转移方程式 #01背包 什么是01背包型问题? 先给大家感受一下01背包型问题: 给定n种物品和一背包.物品i的重量 ...

  7. c++ 多重背包状态转移方程_【模板】各种背包问题amp;讲解

    [模板]各种背包问题&讲解  背包问题集合 一般来说,动态规划(DP)都是初学者最难闯过的一关,而在这里详细解说动态规划的一种经典题型:背包问题. 这里介绍的背包分为以下几种:01背包,完全背 ...

  8. (step3.3) hdu 1059(Dividing——多重背包)

    题目大意:分别给出价值为1~6的石头的数量.问能否将这些石头等价值平分... 解题思路:多重背包 1)多重背包的典型描述是这样的:给出n种物品,背包的容量为V.每种物品的可用数量为num[i],所占体 ...

  9. 1919: kirito's 星爆气流斩 多重背包

    Description 主角kirito是使用世界首款完全潜行游戏"刀剑神域(Sword Art Online)"的玩家.曾经很幸运的参与过封闭测试,并买下正式版的kirito,正 ...

  10. 最少硬币问题----多重背包

    问题描述: 设有n 种不同面值的硬币,各硬币的面值存于数组T[1:n ]中.现要用这些面值的硬币来找钱.可以使用的各种面值的硬币个数存于数组Coins[1:n ]中.对任意钱数0≤m≤20001,设计 ...

最新文章

  1. appium-java长按学习
  2. ubuntu权限管理
  3. 五分钟教你在Go-Bigger中设计自己的游戏AI智能体
  4. 作为一名程序员,谁没跳过槽,“6”招让你“空降”大厂
  5. scala中def_def关键字以及Scala中的示例
  6. 解决在linux环境下面不显示验证码的问题
  7. 1015. 德才论 (25)-PAT乙级真题
  8. Go 性能优化技巧 8/10 1
  9. Cisco职业认证再认证体系及程序问答
  10. 测试Flume-1.6.0写入HDFS(Hadoop-2.7.2)的简单实例
  11. Linux非root用户如何使用80端口启动程序
  12. 如何零基础入门产品经理
  13. postgresql创建序列
  14. nagios原理介绍以及安装部署配置使用
  15. 华为云发布《云原生2.0架构白皮书》,GaussDB技术再升级
  16. html5基础(网页基本标签、图像标签、超链接、列表、表格、媒体元素、iframe框架、表单)
  17. 电影推荐系统、数字识别、垃圾邮件参考文献
  18. [笑话] 有关本人现在是独身的消息不甚走漏
  19. 尺寸大的背光为何设计双AK级?
  20. Wireshark抓取网络聊天

热门文章

  1. 小程序发布上线流程_微信小程序发布流程:公司、个人如何注册小程序
  2. Pytorch房价预测
  3. 【Gitee + Hexo】从0开始搭建自己的博客网站
  4. 面对对象程序设计---第一次blog
  5. 程序员用简单C语言一顿神操作,瞬间打造植物大战僵尸,无人不服
  6. JAVA自学材料大全与技术路线
  7. 自定义View - 仿QQ运动步数效果
  8. Ubuntu修改只能用Guest登录
  9. IT十年人生过客-二十四-转型互联网
  10. 在linux上运行迷宫问题,C语言 迷宫问题(堆栈及其应用)