01背包一维dp数组的实现
二维的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数组的实现相关推荐
- 0-1背包一维数组的执行过程图示
0-1背包一维数组的执行过程图示演示: 假设背包体积为10 从右向左推 可知只有在每次主循环中我们以v=V..0的顺序推f[v],这样才能保证推f[v]时f[v-c[i]]保存的是状态f[i-1][v ...
- 【nyoj - 860】 又见0-1背包 (dp,反向0-1背包,好题好思路)
题干: 又见01背包 时间限制:1000 ms | 内存限制:65535 KB 难度:3 输入 多组测试数据. 每组测试数据第一行输入,n 和 W ,接下来有n行,每行输入两个数,代表第i个物品的 ...
- 01背包 (dp专题)
01背包是在M件物品取出若干件放在空间为W的背包里,每件物品的体积为W1,W2至Wn,与之相对应的价值为P1,P2至Pn.01背包是背包问题中最简单的问题.01背包的约束条件是给定几种物品,每种物品有 ...
- 01背包+概率dp Just another Robbery 抢银行
题意:有n各个银行,每个银行有v[ i ]的钱并且有x [ i ] 的被抓住啊概率,如果被抓概率<=p,那么他是安全的,求他期望的最大钱数. 输入 3 //3组 0.04 3 1 0.02 ...
- 0-1背包使用一维dp数组时为何v要从大到小枚举
样例数据 5 8 3 5 1 2 2 4 5 2 1 3 如若不然,也就是让v按照从小到大的顺序枚举,就会出现 注意高亮的那一行,第一件物品的重量只有3,怎么会得到6呢? 代码如下 #include& ...
- 0-1背包 一维数组为什么逆序枚举
https://blog.csdn.net/aidway/article/details/50726472
- hdu2126 Buy the souvenirs 01背包变形 dp
链接:点我 题意:n个物品,m元钱,每个物品最多买一次,问最多可以买几件物品,并且输出方案数.加一维表示已经买几件物品. 我这里用了一个数组dp[v][2] ,dp[v][0] 储存原本要记录的 dp ...
- noj 1860 保研(01背包 概率dp)
C. 保研 时间限制(普通/Java) : 1000 MS/ 3000 MS 运行内存限制 : 65536 KByte 总提交 : 171 测试通过 : 40 ...
- 动态规划——背包问题整理(01背包+完全背包)
1.引言 背包问题简单描述,其实就是有一堆物品同时具有一定价值和重量,现有一个背包可以承受最大重量m,那么要怎么选择在不超过背包最大重量的前提下,使背包中选择的物品价值最大. 最常见的背包问题又可以分 ...
最新文章
- 为什么是红旗EV?一文拆解中国第一款Robotaxi量产车型
- 保证java的jar包在后台运行
- 亏损63亿,美图真能“美”到上市?
- 基于Jenkins的持续交付全流程设计与实践
- Setuptool+pip安装
- android html转pdf工具,android – 使用iText库将html转换为pdf时未应用hr的内联CSS
- 每日小记2017.2.28
- OpenMP变量的私有与共享
- 从零开始刷Leetcode——数组(1.26)
- sql服务器显示error,SQL server 2008 登陆服务器时提示错误233
- Nginx(2)之nginx作用简介
- 最新要饭网源码1.6终极版
- 什么专业越老越吃香?
- 图像纹理特征总体简述
- java 合并两个音频_如何利用音乐合成软件将多段音频合并为一段?快速合并音频的方法...
- 海贝音频384khz_海贝音乐app下载_海贝音乐安卓版下载[音乐播放器]-下载之家
- python提取时长2s以内的单词音频的韵母基频,以及单词词长信息
- 介绍.NET Core
- gorilla/mux实现http服务示例
- 2113: 小飞的游戏
热门文章
- java集合-set练习题
- linux驱动系列学习之Framebuffer子系统(三)
- “三方演义”与性能优化
- 苹果库乐队怎么玩_苹果安卓手机最简单换铃声方法,无需电脑,简单一步就能换成流行歌曲...
- b站黑马Java就业班笔记P101-P200
- 牛客练习赛6 珂学送分2
- nyoj453 小珂的烦恼 (set容器)
- 常见NoSQL的对比及使用场景(Redis,memcached,mongodb)
- md5压缩函数用java实现,MD5压缩算法介绍
- hbw-utils - 关于guava和jdk的compare方法