动态规划背包问题——01背包
2022.7.20
题意概要:有n个物品和一个容量为p的背包,每个物品有重量w和价值v两种属性,要求选若干物品放入背包使背包中物品的总价值最大且背包中物品的总重量不超过背包的容量。
在上述例题中,由于每个物体只有两种可能的状态(取与不取),对应二进制中的0和1,这类问题便被称为「0-1 背包问题」。
我们用二维数组dp[i][j]表示只放前i个物品时,背包容量不超过j时的最大价值。可以列出动态转移方程dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i])。
for(int i=1;i<=n;i++){for(int j=p;j>=w[i];j--){dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]);}}
但开dp[n][p]的空间会MLE,所以我们要使用滚动数组,得出动态转移方程,删减掉一维,保留对dp[i][j]有影响的i(物品数量)dp[j]=max(dp[j],dp[j-w[i]]+v[i])。
前i-1个物品 | 第i个物品 |
---|---|
j-w[i] | v[i] |
for(int i=1;i<=n;i++){for(int j=p;j>=w[i];j--){f[j]=max(f[j],f[j-w[i]]+v[i]);}
}
注意,我们是从后往前遍历的,因为对于当前处理的物品i和当前状态dp[i][j],在j>=w[i]时,dp[i][j]是会被dp[i][j-w[i]]所影响的。这就相当于物品 可以多次被放入背包,与题意不符。为了避免这种情况发生,我们可以改变枚举的顺序,从p枚举到w[i],这样就不会出现上述的错误,因为dp[i][j]总是在dp[i][j-w[i]]前被更新。
真题演练:(信息学奥赛一本通 1267:【例9.11】01背包问题)
题目描述:
一个旅行者有一个最多能装 MM 公斤的背包,现在有 n 件物品,它们的重量分别是W1,W2,...,Wn,它们的价值分别为C1,C2,...,Cn,求旅行者能获得最大总价值。
输入格式:
第一行:两个整数,M(背包容量,M<=200)和N(物品数量,N<=30);第2..N+1行:每行二个整数Wi,Ci,表示每个物品的重量和价值。
输入样例:
10 4
2 1
3 3
4 5
7 9
输出样例:
12
思路:
这是一道模板题。
代码:
#include <iostream>
#include <algorithm>
#include <iomanip>
#include <cstring>
#include <fstream>
#include <sstream>
#include <vector>
#include <string>
#include <cstdio>
#include <cmath>
#include <deque>
#include <queue>
#include <stack>
#include <list>
#include <map>
#define int long long
using namespace std;
const int N = 1e5 + 10;
const int INF = 0x3f3f3f3f;
int p,n,w[40],c[40],f[400];
signed main(){cin >>p>>n;for(int i=1;i<=n;i++){cin >>w[i]>>c[i];}for(int i=1;i<=n;i++){for(int j=p;j>=w[i];j--){f[j]=max(f[j],f[j-w[i]]+c[i]);}}cout <<f[p];return 0;
}
动态规划背包问题——01背包相关推荐
- 动态规划——背包问题01背包
有n件物品和一个最多能背重量为w 的背包.第i件物品的重量是weight[i],得到的价值是value[i] .每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大. 动态规划五部曲: 确定d ...
- 动态规划之背包问题——01背包
算法相关数据结构总结: 序号 数据结构 文章 1 动态规划 动态规划之背包问题--01背包 动态规划之背包问题--完全背包 动态规划之打家劫舍系列问题 动态规划之股票买卖系列问题 动态规划之子序列问题 ...
- 背包问题——01背包
背包问题--01背包 01背包作为动态规划(dynamic programing)中最基础的问题,需要我们彻底理解其中的原理,为以后解决更难的动态规划问题打下良好的基础. 这里拟定一个01背包问题: ...
- 算法模板:动态规划之01背包【沈七】
算法模板:动态规划之01背包 前言 动态规划 01背包 二维背包 一维优化 经典习题 小A点菜 5 倍经验日 买干草 完结散花 参考文献 前言 唤我沈七就好啦. 动态规划 核心作用:优化 当数据范围& ...
- C++ 背包问题——01背包
由于编辑器原因,01背包文章搬家了,想看到更好的01背包问题题解,请点击链接: C++背包问题--01背包_小天狼星_布莱克的博客-CSDN博客
- 动态规划之背包问题---01背包---完全背包---多重背包
本篇博客是基于Carl大佬的刷题笔记 (代码随想录) 进行总结的 另外加入了我自己的一些整理,特此记录,以防遗忘 几种在面试中常见的背包,其关系如下: 通过这个图,可以很清晰分清这几种常见背包之间的关 ...
- 动态规划之背包问题 01背包
什么是01背包? 有n件物品和一个最多能背重量为w 的背包.第i件物品的重量是weight[i],得到的价值是value[i] .每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大. 首先, ...
- 算法-动态规划(01背包)
最近闲来无事,学学算法. 什么是动态规划,我们要如何描述它? 动态规划算法通常基于一个递推公式及一个或多个初始状态.当前子问题的解将由上一次子问题的解推出.使用动态规划来解题只需要多项式时间复杂度,因 ...
- 【动态规划】01背包:P1060 开心的金明
01背包: 容量为N,重量为v[i],价值为v[i]*w[i] [动态规划笔记]01背包问题及优化_m0_52043808的博客-CSDN博客 代码: #include<iostream> ...
最新文章
- jmeter--轻量级接口自动化测试框架
- java的使用Pair要导入什么包,第三方jar包的使用
- 有多个路由器的子网的分配
- 深度学习之递归神经网络(Recurrent Neural Network,RNN)
- 【C#】ADO .Net Entities Framework使用查询语句时遇到的错误
- 我用 Python 3分钟实现9种经典排序算法的可视化
- PLC-PC communication with C#: a quick resume about data exchange libraries
- python课设答辩ppt_如何制作优秀的毕业论文答辩PPT
- python的内存模型
- Python对象实现ToString
- python 车辆识别_PythonAI应用(1)车辆识别
- aws服务器修改root密码,使用Xshell登录AWS EC2服务器设置root+密码方式登录
- c语言编写函数isprime(int a),用来判断自变量a是否为素数,若是素数,函数返回1,否则返回0。
- 安卓反编译smali代码注入第三方广告
- 对比PAYPAL和国际信用卡支付的流程
- Ogre procedural 几何图元库
- 全触屏智能之战 三星i908E对比iPhone 3G
- gdpr通用数据保护条例_关于通用数据保护法规(GDPR),您需要了解的15件事
- Win7中设置共享文件夹(通过账户密码访问)
- “链”向未来——前景广阔的TD源链