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]}


代码如下:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<queue>
  6. #include<map>
  7. #include<set>
  8. #include<stack>
  9.  
  10. using namespace std;
  11.  
  12. const int maxnp = ;
  13. const int maxnw = ;
  14. int dp[maxnp][maxnw];
  15. int value[maxnp];
  16. int weight[maxnw];
  17. int N, M;
  18.  
  19. void output();
  20.  
  21. void solve()
  22. {
  23. memset(dp,,sizeof(dp));
  24.  
  25. for(int i = ; i <= N ; i++)
  26. {
  27. for(int j = ; j < weight[i] ; j++)
  28. dp[i][j] = dp[i-][j];
  29. for(int v = weight[i] ; v <= M ; v++)
  30. {
  31. dp[i][v] = max(dp[i-][v],dp[i-][v-weight[i]]+value[i]);
  32. }
  33. }
  34. }
  35.  
  36. int main()
  37. {
  38. cin >> N >> M;
  39.  
  40. for(int i = ; i <= N; i++)
  41. {
  42. cin >> weight[i] >> value[i];
  43. }
  44.  
  45. solve();
  46.  
  47. cout << dp[N][M] <<endl;
  48. }

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

  1. for(int j = ; j < weight[i] ; j++)
  2. dp[i][j] = dp[i-][j];
  3. for(int v = weight[i] ; v <= M ; v++)
  4. {
  5. dp[i][v] = max(dp[i-][v],dp[i-][v-weight[i]]+value[i]);
  6. }

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

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

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

代码如下:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<queue>
  6. #include<map>
  7. #include<set>
  8. #include<stack>
  9.  
  10. using namespace std;
  11.  
  12. const int maxnp = ;
  13. const int maxnw = ;
  14. int dp[maxnw];
  15. int value[maxnp];
  16. int weight[maxnw];
  17. int N, M;
  18.  
  19. void solve()
  20. {
  21. memset(dp,,sizeof(dp));
  22. for(int i = ; i <= N; i++)
  23. {
  24. for(int j = M ; j >= weight[i] ; j--)
  25. {
  26. dp[j] = max(dp[j], dp[j-weight[i]] + value[i]);
  27. }
  28. }
  29. cout << dp[M] << endl;
  30. }
  31.  
  32. int main()
  33. {
  34. while(cin >> N >> M)
  35. {
  36. for(int i = ; i <= N; i++)
  37. {
  38. cin >> weight[i] >> value[i];
  39. }
  40. solve();
  41. }
  42. return ;
  43. }

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

这个是我第一次写出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. VirtualBox中安装Ubuntu12.04/Ubuntu14.04虚拟机(转)

    add by zhj: 如果宿主机是win7,那VirtualBox建议安装4.3.12,再高的版本在Windows7上运行会报错,从4.3.14到5.0.xx版本,一直报错,搞了半天也解决不了.如果 ...

  2. linux下的时间管理概述

    2017/6/21 时间这一概念在生活中至关重要,而在操作系统中也同样重要,其在系统中的功能绝不仅仅是给用户提供时间这么简单,内核的许多机制都依赖于时间子系统.但凡是要在某个精确的时间执行某个事件,必 ...

  3. Python作用域-->闭包函数-->装饰器

    1.作用域: 在python中,作用域分为两种:全局作用域和局部作用域. 全局作用域是定义在文件级别的变量,函数名.而局部作用域,则是定义函数内部. 关于作用域,我要理解两点:a.在全局不能访问到局部 ...

  4. httprunner上传文件multipart/form-data

    Content-Type = multipart/form-data#上传文件 Rquest Payload ------WebKitFormBoundarymAyGmnyhpf3UBdec    C ...

  5. Linux ssh服务

    关于ssh服务不多说就提几句,1,机房的服务器一般都是通过远程连接登录的,远程登录就必然少不了ssh客户端.2,虚拟机每次都要点击进去,每次退出来也需要按Ctrl+Alt+Enter,也比较麻烦,有时 ...

  6. Redis 搜索引擎优化

    场景 大家如果是做后端开发的,想必都实现过列表查询的接口,当然有的查询条件很简单,一条 SQL 就搞定了,但有的查询条件极其复杂,再加上库表中设计的各种不合理,导致查询接口特别难写,然后加班什么的就不 ...

  7. 将Ext JS 5应用程序导入Web项目中

    相关资料:http://docs.sencha.com/extjs/5.1/getting_started/welcome_to_extjs.html 原文地址: https://blog.csdn. ...

  8. Jmeter+jenkins如何快速搭建接口和性能测试持续集成解决方案-[基于windows篇]

    最近在用Jmeter本来想写一个详细的使用教程,突然看到有前辈已经写好了不错的教程,特此"借花献佛"整理出来分享给大家! Jenkins + Jmeter 构建接口.性能测试持续集 ...

  9. 一步一步学EF系列一【最简单的一个实例】

    整个文章我都会用最简单,最容易让人理解的方式给大家分享和共同学习.(由于live Writer不靠谱 又得补发一篇) 一.安装 Install-Package EntityFramework 二.简单 ...

  10. PKU 4334 Trouble(哈希)

    原题链接 思路:哈希存入相反数 注意:HDU不支持long long要使用__int64 #include<cstdio> #include<cstring> #define ...