01背包,完全背包,多重背包
好像从没有系统的整理过……
【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背包,完全背包,多重背包相关推荐
- 背包问题-【01背包】【完全背包】【多重背包】【多限定条件背包】
背包问题 给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高. 可参考https://www.cnblogs.com/-guz/p/9866118.h ...
- 小明打联盟 牛客(背包dp,多重背包)
链接:https://ac.nowcoder.com/acm/problem/14553 来源:牛客网 题目描述 小明很喜欢打游戏,现在已知一个新英雄即将推出,他同样拥有四个技能,其中三个小技能的释放 ...
- 01背包模板、全然背包 and 多重背包(模板)
转载请注明出处:http://blog.csdn.net/u012860063 贴一个自觉得解说不错的链接:http://www.cppblog.com/tanky-woo/archive/2010/ ...
- 【qduoj - 142】 多重背包(0-1背包的另类处理,dp)
题干: ycb的ACM进阶之路 Description ycb是个天资聪颖的孩子,他的梦想是成为世界上最伟大的ACMer.为此,他想拜附近最有威望的dalao为师.dalao为了判断他的资质,给他出了 ...
- 01背包模板、完全背包 and 多重背包
转载请注明出处:http://blog.csdn.net/u012860063 讲解链接:http://www.cppblog.com/tanky-woo/archive/2010/07/31/121 ...
- 【python】一篇讲透背包问题(01背包 完全背包 多重背包 二维费用背包)
面对背包问题,有一个很重要的方程式:状态转移方程式 所以每一种背包问题我都会给出状态转移方程式 #01背包 什么是01背包型问题? 先给大家感受一下01背包型问题: 给定n种物品和一背包.物品i的重量 ...
- c++ 多重背包状态转移方程_【模板】各种背包问题amp;讲解
[模板]各种背包问题&讲解 背包问题集合 一般来说,动态规划(DP)都是初学者最难闯过的一关,而在这里详细解说动态规划的一种经典题型:背包问题. 这里介绍的背包分为以下几种:01背包,完全背 ...
- (step3.3) hdu 1059(Dividing——多重背包)
题目大意:分别给出价值为1~6的石头的数量.问能否将这些石头等价值平分... 解题思路:多重背包 1)多重背包的典型描述是这样的:给出n种物品,背包的容量为V.每种物品的可用数量为num[i],所占体 ...
- 1919: kirito's 星爆气流斩 多重背包
Description 主角kirito是使用世界首款完全潜行游戏"刀剑神域(Sword Art Online)"的玩家.曾经很幸运的参与过封闭测试,并买下正式版的kirito,正 ...
- 最少硬币问题----多重背包
问题描述: 设有n 种不同面值的硬币,各硬币的面值存于数组T[1:n ]中.现要用这些面值的硬币来找钱.可以使用的各种面值的硬币个数存于数组Coins[1:n ]中.对任意钱数0≤m≤20001,设计 ...
最新文章
- appium-java长按学习
- ubuntu权限管理
- 五分钟教你在Go-Bigger中设计自己的游戏AI智能体
- 作为一名程序员,谁没跳过槽,“6”招让你“空降”大厂
- scala中def_def关键字以及Scala中的示例
- 解决在linux环境下面不显示验证码的问题
- 1015. 德才论 (25)-PAT乙级真题
- Go 性能优化技巧 8/10 1
- Cisco职业认证再认证体系及程序问答
- 测试Flume-1.6.0写入HDFS(Hadoop-2.7.2)的简单实例
- Linux非root用户如何使用80端口启动程序
- 如何零基础入门产品经理
- postgresql创建序列
- nagios原理介绍以及安装部署配置使用
- 华为云发布《云原生2.0架构白皮书》,GaussDB技术再升级
- html5基础(网页基本标签、图像标签、超链接、列表、表格、媒体元素、iframe框架、表单)
- 电影推荐系统、数字识别、垃圾邮件参考文献
- [笑话] 有关本人现在是独身的消息不甚走漏
- 尺寸大的背光为何设计双AK级?
- Wireshark抓取网络聊天