2017-08-12 18:50:13

writer:pprp

对于最基础的动态规划01背包问题,都花了我好长时间去理解;

poj3624是一个最基本的01背包问题:

题意:给你N个物品,给你一个容量为M的背包

  给你每个物品的重量,Wi

  给你每个物品的价值,Di

  求解在该容量下的物品最高价值?

分析:

  状态:

    dp[i][j] = a 剩下i件 当前容量为j的情况下的最大价值为a

  如果用 i 来枚举物品编号, 用 j 来枚举重量,那么

    if ( j is from 1 to weight[i] )  dp[i][j] = dp[i-1][j];

    if( j is from weight[i] to M) dp[i][j] = max{ dp[i-1][j] , dp[i-1][j - weight[i]] + value[i]}


代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<map>
#include<set>
#include<stack> using namespace std; const int maxnp = ;
const int maxnw = ;
int dp[maxnp][maxnw];
int value[maxnp];
int weight[maxnw];
int N, M; void output(); void solve()
{
memset(dp,,sizeof(dp)); for(int i = ; i <= N ; i++)
{
for(int j = ; j < weight[i] ; j++)
dp[i][j] = dp[i-][j];
for(int v = weight[i] ; v <= M ; v++)
{
dp[i][v] = max(dp[i-][v],dp[i-][v-weight[i]]+value[i]);
}
}
} int main()
{
cin >> N >> M; for(int i = ; i <= N; i++)
{
cin >> weight[i] >> value[i];
} solve(); cout << dp[N][M] <<endl;
}

然后可以从上边的这个部分:

for(int j =  ; j < weight[i] ; j++)
dp[i][j] = dp[i-][j];
for(int v = weight[i] ; v <= M ; v++)
{
dp[i][v] = max(dp[i-][v],dp[i-][v-weight[i]]+value[i]);
}

看出来有点冗余复杂,出现了MLE

现在重新定义一个状态:dp[i]表示重量剩余 i 的时候可以得到的最大价值

状态转移:dp[i] = max(dp[i], dp[i-weigth[j]]+value[j]);

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<map>
#include<set>
#include<stack> using namespace std; const int maxnp = ;
const int maxnw = ;
int dp[maxnw];
int value[maxnp];
int weight[maxnw];
int N, M; void solve()
{
memset(dp,,sizeof(dp));
for(int i = ; i <= N; i++)
{
for(int j = M ; j >= weight[i] ; j--)
{
dp[j] = max(dp[j], dp[j-weight[i]] + value[i]);
}
}
cout << dp[M] << endl;
} int main()
{
while(cin >> N >> M)
{
for(int i = ; i <= N; i++)
{
cin >> weight[i] >> value[i];
}
solve();
}
return ;
}

这个代码可以保证不会内存超限

这个是我第一次写出dp的代码,希望以后写的越来越好

动态规划入门-01背包问题 - poj3624的更多相关文章

  1. 动态规划专题 01背包问题详解 HDU 2546 饭卡

    我以此题为例,详细分析01背包问题,希望该题能够为大家对01背包问题的理解有所帮助,对这篇博文有什么问题可以向我提问,一同进步^_^ 饭卡 Time Limit: 5000/1000 MS (Java ...

  2. C++动态规划求解0-1背包问题

    问题描述: 给定n种物品和一背包.物品i的重量是wi,其价值为vi,背包的容量为C.问:应该如何选择装入背包的物品,是的装入背包中物品的总价值最大? 细节须知: 暂无. 算法原理: a.最优子结构性质 ...

  3. 动态规划(DP),0-1背包问题

    题目链接:http://poj.org/problem?id=3624 1.p[i][j]表示,背包容量为j,从i,i+1,i+2,...,n的最优解. 2.递推公式 p[i][j]=max(p[i+ ...

  4. nyoj 49-开心的小明(动态规划, 0-1背包问题)

    49-开心的小明 内存限制:64MB 时间限制:1000ms Special Judge: No accepted:7 submit:11 题目描述: 小明今天很开心,家里购置的新房就要领钥匙了,新房 ...

  5. DP动态规划之01背包问题

    目录 问题描述 问题分析 问题求解 Java代码实现 优化方向一:时间方面:因为是j是整数是跳跃式的,可以选择性的填表. 思考二:处理j(背包容量),w(重量)不为整数的时候,因为j不为整数了,它就没 ...

  6. ACM:动态规划,01背包问题

    题目: 有n件物品和一个容量为C的背包.(每种物品均仅仅有一件)第i件物品的体积是v[i],重量是w[i].选一些物品装到这个背包中,使得背包内物品在整体积不超过C的前提下重量尽量大. 解法:两种思路 ...

  7. 0-1背包问题——动态规划求解【Python】

    动态规划求解0-1背包问题: 问题:背包大小 w,物品个数 n,每个物品的重量与价值分别对应 w[i] 与 v[i],求放入背包中物品的总价值最大. 动态规划核心:计算并存储小问题的最优解,并将这些最 ...

  8. 01背包问题:POJ3624

    背包问题是动态规划中的经典问题,而01背包问题是最基本的背包问题,也是最需要深刻理解的,否则何谈复杂的背包问题. POJ3624是一道纯粹的01背包问题,在此,加入新的要求:输出放入物品的方案. 我们 ...

  9. c语言数据结构:01背包问题-------动态规划

    两天的时间都在学习动态规划:小作业(01背包问题:) 数据结构老师布置的这个小作业还真是让人伤头脑,自己实在想不出来了便去网上寻找讲解,看到一篇不错的文章: http://www.cnblogs.co ...

随机推荐

  1. php格式化输出数组

    写网页的时候经常需要在页面中打印数组,但格式特别难看,看看一个html神器吧<pre>标签,能非常标准的显示数组格式 使用的时候只需要这样打印你的数组就OK了,太好用了,神器! echo ...

  2. CF#301 B:School Marks(贪心)

    B:School Marks 有n个测试,已经完成了k个,每个测试得分为a[i],接下来的分数不知道,让我们求出任何一个满足题意的即可,满足题意就是n个测试的得分总和<=x, 中位数>=y ...

  3. pandas.read_csv() 部分参数解释

    read_csv()所有参数 pandas.read_csv( filepath_or_buffer, sep=',', delimiter=None, header='infer', names=N ...

  4. 禁止Centos系统You have new mail in /var/spool/mail/root提示

    禁止Centos系统You have new mail in /var/spool/mail/root提示 https://blog.csdn.net/oyym_mv/article/details/ ...

  5. springboot跨域处理

    /** * @author 657642432@qq.com * 跨域处理 */ @Configuration public class CorsConfig { @Bean public Filte ...

  6. 磁钉导航差速式AGV控制实验

    磁钉导航AGV实验 2016-03 本机器是采用RFID电子地标配合磁钉传感器的定位导航AGV.本AGV已初步实现里程计精确解算,磁钉数据融合,AGV定点精准停车.原地旋转换向.远程无线调度的功能,初 ...

  7. MySQL协议分析(2)

    MySQL协议分析(2) 此阶段是在压缩传输无加密条件下进行的协议分析 思路 结合Oracle官网的说明和自己用wireshark加python进行数据包分析 步骤 客户端与服务器端是否压缩的协商阶段 ...

  8. TFTP服务器 NFS服务器 smb 、wireshark

    在嵌入式开发过程中有宿主机和目标机的角色之分 宿主机是执行编译.链接嵌入式软件的计算机:目标机是运行嵌入式软件的硬件平台 宿主机一般通过网络.USB.JTAG等方式将软件下载到目标机. 网络下载:tf ...

  9. ibatis打印sql

    ###显示SQL语句部分log4j.logger.com.ibatis=DEBUGlog4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUGl ...

  10. 20165324《Java程序设计》第七周

    20165324<Java程序设计>第七周 教材学习内容总结 第11章 JDBC与MySOLz数据库 MySQL数据库管理系统,简称MySQL. 使用步骤: 启动MySQL数据库服务 器建 ...