二维的01背包模板

#include <iostream>
#include <cstdio>
#include <cstring>using namespace std;const int maxw = 10000;
const int maxn = 100;
int n,W;
int w[maxw+2],v[maxn+2],dp[maxn+2][maxw+2];int main()
{
     cin >> n >> W;
     for (int i = 0;i < n;i ++)
         cin >> w[i] >> v[i];
     memset(dp,0,sizeof(dp));
     for (int i = 0;i < n;i ++)
     {         for (int j = 0;j <= W;j ++)
         {             if (j < w[i])
                 dp[i+1][j] = dp[i][j];
             else
                 dp[i+1][j] = max(dp[i][j] , dp[i+1][j-w[i]]+v[i]);
         }
     }
     printf("%d\n",dp[n][W]);     return 0;
}

用一维dp数组优化空间复杂度

#include < cstdio >
#include < iostream >
#include < cstring >using namespace std;const int maxw = 10000;
const int maxn = 100;
int n,W;
int w[maxw+2],v[maxn+2],dp[maxw+2];int main()
{cin >> n >> W;for (int i = 0;i < n;i ++)cin >> w[i] >> v[i];memset(dp,0,sizeof(dp));for (int i = 0;i < n;i ++){for(int j = W;j > w[i];j --){dp[j] = max(dp[j] , dp[j-w[i]]+v[i]);}}printf("%d\n",dp[W]);return 0;
}

其中第二个循环一定要逆序,这是因为,
“当转移方程中,这一层的状态完全由上一层的状态组成”
“就是dp[j-w[i]] +v[i]就是把i这个物体取了“
”所以可以由上一层的j-w[i]加上v[i]转移到这一层的j“
(by蓝神)。
也就是说,max里面的dp[j] 是上一层的 dp[j-w[i]]也是上一层的,用上一层费用用j的价值量和上一层费用为j-w[i] (也就是未取第i个时)的价值量加上这一层第i个之后的价值量之和的最大值来更新dp[i],达到滚动数组的目的。

01背包一维dp数组的实现相关推荐

  1. 0-1背包一维数组的执行过程图示

    0-1背包一维数组的执行过程图示演示: 假设背包体积为10 从右向左推 可知只有在每次主循环中我们以v=V..0的顺序推f[v],这样才能保证推f[v]时f[v-c[i]]保存的是状态f[i-1][v ...

  2. 【nyoj - 860】 又见0-1背包 (dp,反向0-1背包,好题好思路)

    题干: 又见01背包 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 输入 多组测试数据. 每组测试数据第一行输入,n 和 W ,接下来有n行,每行输入两个数,代表第i个物品的 ...

  3. 01背包 (dp专题)

    01背包是在M件物品取出若干件放在空间为W的背包里,每件物品的体积为W1,W2至Wn,与之相对应的价值为P1,P2至Pn.01背包是背包问题中最简单的问题.01背包的约束条件是给定几种物品,每种物品有 ...

  4. 01背包+概率dp Just another Robbery 抢银行

    题意:有n各个银行,每个银行有v[ i ]的钱并且有x [ i ] 的被抓住啊概率,如果被抓概率<=p,那么他是安全的,求他期望的最大钱数. 输入 3    //3组 0.04 3 1 0.02 ...

  5. 0-1背包使用一维dp数组时为何v要从大到小枚举

    样例数据 5 8 3 5 1 2 2 4 5 2 1 3 如若不然,也就是让v按照从小到大的顺序枚举,就会出现 注意高亮的那一行,第一件物品的重量只有3,怎么会得到6呢? 代码如下 #include& ...

  6. 0-1背包 一维数组为什么逆序枚举

    https://blog.csdn.net/aidway/article/details/50726472

  7. hdu2126 Buy the souvenirs 01背包变形 dp

    链接:点我 题意:n个物品,m元钱,每个物品最多买一次,问最多可以买几件物品,并且输出方案数.加一维表示已经买几件物品. 我这里用了一个数组dp[v][2] ,dp[v][0] 储存原本要记录的 dp ...

  8. noj 1860 保研(01背包 概率dp)

    C. 保研 时间限制(普通/Java) : 1000 MS/ 3000 MS          运行内存限制 : 65536 KByte 总提交 : 171            测试通过 : 40 ...

  9. 动态规划——背包问题整理(01背包+完全背包)

    1.引言 背包问题简单描述,其实就是有一堆物品同时具有一定价值和重量,现有一个背包可以承受最大重量m,那么要怎么选择在不超过背包最大重量的前提下,使背包中选择的物品价值最大. 最常见的背包问题又可以分 ...

最新文章

  1. 为什么是红旗EV?一文拆解中国第一款Robotaxi量产车型
  2. 保证java的jar包在后台运行
  3. 亏损63亿,美图真能“美”到上市?
  4. 基于Jenkins的持续交付全流程设计与实践
  5. Setuptool+pip安装
  6. android html转pdf工具,android – 使用iText库将html转换为pdf时未应用hr的内联CSS
  7. 每日小记2017.2.28
  8. OpenMP变量的私有与共享
  9. 从零开始刷Leetcode——数组(1.26)
  10. sql服务器显示error,SQL server 2008 登陆服务器时提示错误233
  11. Nginx(2)之nginx作用简介
  12. 最新要饭网源码1.6终极版
  13. 什么专业越老越吃香?
  14. 图像纹理特征总体简述
  15. java 合并两个音频_如何利用音乐合成软件将多段音频合并为一段?快速合并音频的方法...
  16. 海贝音频384khz_海贝音乐app下载_海贝音乐安卓版下载[音乐播放器]-下载之家
  17. python提取时长2s以内的单词音频的韵母基频,以及单词词长信息
  18. 介绍.NET Core
  19. gorilla/mux实现http服务示例
  20. 2113: 小飞的游戏

热门文章

  1. java集合-set练习题
  2. linux驱动系列学习之Framebuffer子系统(三)
  3. “三方演义”与性能优化
  4. 苹果库乐队怎么玩_苹果安卓手机最简单换铃声方法,无需电脑,简单一步就能换成流行歌曲...
  5. b站黑马Java就业班笔记P101-P200
  6. 牛客练习赛6 珂学送分2
  7. nyoj453 小珂的烦恼 (set容器)
  8. 常见NoSQL的对比及使用场景(Redis,memcached,mongodb)
  9. md5压缩函数用java实现,MD5压缩算法介绍
  10. hbw-utils - 关于guava和jdk的compare方法