POJ-动态规划-背包问题模板
背包问题模板
一、0-1背包
状态:背包容量为j时,求前i个物品所能达到最大价值,设为dp[i][j]。初始时,dp[0][j](0<=j<=V)为0,没有物品也就没有价值。
状态转移方程:由上述分析,第i个物品的体积为w,价值为v,则状态转移方程为
- j<w,dp[i][j] = dp[i-1][j] //背包装不下该物品,最大价值不变
- j>=w, dp[i][j] = max{ dp[i-1][j-list[i].w] + v, dp[i-1][j] } //和不放入该物品时同样达到该体积的最大价值比较
结构体:存放物品的体积和价值
struct Thing
{
int w;
int v;
}list[];
1.init():dp[][]数组初始化
int s, n;//背包容量和物品总数
void init()
{
for (int i = ; i <= s; i++) dp[][i] = ;//没有物品时最大价值均为0
}
2.package():执行背包,求解问题
void package()
{
for (int i = ; i <= n; i++)//循环每个物品,执行状态转移方程
{
for (int j = ; j <= s; j++)
{
if (j >= list[i].w) dp[i][j] = max(dp[i - ][j], dp[i - ][j - list[i].w] + list[i].v);
else dp[i][j] = dp[i - ][j];
}
}
}
优化后的一维01背包
1.init():dp[][]数组初始化
int s, n;//背包容量和物品总数
void init()
{
for (int i = ; i <= s; i++) dp[i] = ;//初始化二维数组//没有物品时最大价值均为0
}
2.package():执行背包,求解问题
void package()
{
for (int i = ; i <= n; i++)//循环每个物品,逆序遍历j执行状态转移方程
{
for (int j = s; j >= list[i].w; j--)
{
dp[j] = max(dp[j], dp[j - list[i].w] + list[i].v);
}
}
}
二、完全背包
1.init():dp[][]数组初始化
void init()
{
for (int i = ; i <= s; i++) dp[i] = ;//初始化二维数组//没有物品时最大价值均为0
}
2.package():执行背包,求解问题,正序遍历即可实现复用。
void package()
{
for (int i = ; i <= n; i++)//循环每个物品,正序遍历j执行状态转移方程
{
for (int j = list[i].w; j <= s; j++)
{
dp[j] = max(dp[j], dp[j - list[i].w] + list[i].v);
}
}
}
POJ-动态规划-背包问题模板的更多相关文章
- poj 动态规划题目列表及总结
此文转载别人,希望自己能够做完这些题目! 1.POJ动态规划题目列表 容易:1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 11 ...
- poj动态规划列表
[1]POJ 动态规划题目列表 容易: 1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 1189, 1208, 1276, 13 ...
- POJ 动态规划题目列表
]POJ 动态规划题目列表 容易: 1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 1189, 1208, 1276, 1322 ...
- poj 动态规划的主题列表和总结
此文转载别人,希望自己可以做完这些题目. 1.POJ动态规划题目列表 easy:1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, ...
- js动态规划---背包问题
//每种物品仅有一件,可以选择放或不放 //即f[i][w]表示前i件物品恰放入一个容量为w的背包可以获得的最大价值. //则其状态转移方程便是:f[i][w]=max{f[i-1][w],f[i-1 ...
- P1060 开心的金明(动态规划背包问题)
题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:"你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过NN元钱 ...
- Poj 2187 凸包模板求解
Poj 2187 凸包模板求解 传送门 由于整个点数是50000,而求凸包后的点也不会很多,因此直接套凸包之后两重循环即可求解 #include <queue> #include < ...
- 背包问题模板,POJ(1014)
题目链接:http://poj.org/problem?id=1014 背包问题太经典了,之前的一篇博客已经讲了背包问题的原理. 这一个题目是多重背包,但是之前的枚举是超时的,这里采用二进制优化. 这 ...
- POJ 1276 Cash Machine -- 动态规划(背包问题)
题目地址:http://poj.org/problem?id=1276 Description A Bank plans to install a machine for cash withdrawa ...
随机推荐
- 几种访问HDFS文件的客户端的总结
HDFS是英文Hadoop Distributed File System的缩写,中文翻译为Hadoop分布式文件系统,它是实现分布式存储的一个系统,所以分布式存储有的特点,HDFS都会有,HDFS的 ...
- es6 | 新增语法 | 总结
电梯 原文 https://www.jianshu.com/p/5f40c43c6f85 重点: 遍历map结构 正则扩展 at相当于charAt() ,可以识别中文normarize()includ ...
- Big Data Landscape 2018
https://mattturck.com/bigdata2018/
- react native 从创建到部署
source code: 开源库 rn源代码 native源代码 sourcecode tool: npm react-native vscode xocde.vscode ide+tools ...
- new String("123") 创建了几个对象?
String 对象可谓再熟悉不过了,与此相关的面试题经常会引出内存性能优化的问题,本篇主要以 new String("123") 创建了几个对象为例记录. 一.你能回答正确吗 St ...
- MySQL InnoDB primary key根节点常驻内存
mysql的InnoDB存储引擎在设计时是将根节点常驻内存的,也就是说查找某一键值的行记录时最多只需要1~3次磁盘I/O操作.
- Linux OOM一二三
Linux开发一般会遇到“/proc/sys/vm/overcommit_memory”,即文件/etc/sysctl.conf中的vm.overcommit_memory,Overcommit的意思 ...
- Kafka的基本概念
Kafka的前身是由LinkedIn开源的一款产品,2011年初开始开源,加入了 Apache 基金会,2012年从 Apache Incubator 毕业变成了 Apache 顶级开源项目. Top ...
- shell 文件比较符
文件夹不存在创建 if [ ! -d "/data/" ];then mkdir /data else echo "文件夹已经存在" fi 文件存在则删除 if ...
- 面试问烂的 MySQL 四种隔离级别,看完吊打面试官!
阅读本文大概需要 5.6 分钟. 来源:网络 什么是事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消.也就是事务具有原子性,一个事务中的一系列的操 ...