dp入门之01背包问题
...通过暴力手推得到的一点点感觉
动态规划是相对于贪心算法的一种取得最优解的算法,通过对每一步的取舍判断从 0 推到所拥有的第 n 件物品,每次判断可以列写出状态转移方程,通过记忆化相对暴力地取得最优解,如果有 n 件物品,容量为 m 的背包,则时间复杂度为 O(n*m)
状态转移方程如下:
for(int i=;i<=n;i++)
for(int j=;j<=m0;j++)
{
if(j>=w[i])
{
dp[i][j]=max(dp[i-][j-w[i]]+v[i],dp[i-][j]);
}
else
{
dp[i][j]=dp[i-][j];
}
}
程序如下:
#include "iostream"
#include "stdio.h"
using namespace std;
int w[],v[];
int dp[][];
int main()
{
int n,m;
scanf("%d%d",&m,&n);
for(int i=;i<=n;i++)
{
scanf("%d%d",&w[i],&v[i]);
}
for(int i=;i<=n;i++)
for(int j=0;j<=m;j++)
{
if(j>=w[i])
{
dp[i][j]=max(dp[i-][j-w[i]]+v[i],dp[i-][j]);
}
else
{
dp[i][j]=dp[i-][j];
}
}
printf("%d",dp[n][m]);
return ;
}
考虑使用动态规划时,应先判断是否满足动态规划所需要的两个特性:
- 无后效性:简单来说就是过去与未来无关,只需要知道过去所取得最优解的结果,对于怎么取得的并不关心(比如本题中取得 f(3,5)=7时,只知道7是由 f ( 2 , 2 ) + v [ 3 ] = 3 + 4 = 7,并不关心过去的 f(2,2)时怎么得来的;
- 最优子结构性:即“大问题的最优解可以由小问题的最优解推出”(比如本题中得到的每一个 f ( i , j )都是判断是否舍去前一个 i 所带的信息
题目可以试做洛谷1048采药:https://www.luogu.org/problemnew/show/P1048
据说使用二维数组的空间复杂度太高,数据小大就会爆内存,因此便有一维数组的dp:
核心代码:
for(int i=;i<=m;i++)
for(int j=t;j>=;j--)
if(j>=w[i])
dp[j]=max(dp[j-w[i]]+val[i], dp[j]);
else dp[j]=dp[j];
正确性证明 :我还不会 :)谁来教教我orz
dp入门之01背包问题的更多相关文章
- DP动态规划之01背包问题
目录 问题描述 问题分析 问题求解 Java代码实现 优化方向一:时间方面:因为是j是整数是跳跃式的,可以选择性的填表. 思考二:处理j(背包容量),w(重量)不为整数的时候,因为j不为整数了,它就没 ...
- dp或dfs(01背包问题)
链接:https://ac.nowcoder.com/acm/contest/993/C来源:牛客网题意:n头牛,给出它们的H高度,问这些牛的高度叠加起来大于等于书架高度,问叠加后的高度与书架的差值最 ...
- 经典DP动规 0-1背包问题 二维与一维
先上代码 b站讲解视频 灯神讲背包 #include <iostream> #include <cstring> #include <algorithm> usin ...
- 01背包问题之2(dp)
01背包问题之2 有n个物品,重量和价值分别为wi和vi,从这些物品中挑选出重量不超过W的物品,求所有挑选方案中物品价值总和的最大值 限制条件: 1 <= n <= 100; 1 < ...
- 普通01背包问题(dp)
有n个物品,重量和价值分别为wi和vi,从这些物品中挑选出重量不超过W的物品,求所有挑选方案中物品价值总和的最大值 限制条件: 1 <= n <= 100; 1 <= wi,vi & ...
- 动态规划入门-01背包问题 - poj3624
2017-08-12 18:50:13 writer:pprp 对于最基础的动态规划01背包问题,都花了我好长时间去理解: poj3624是一个最基本的01背包问题: 题意:给你N个物品,给你一个容量 ...
- 01背包问题的延伸即变形 (dp)
对于普通的01背包问题,如果修改限制条件的大小,让数据范围比较大的话,比如相比较重量而言,价值的范围比较小,我们可以试着修改dp的对象,之前的dp针对不同的重量限制计算最大的价值.这次用dp针对不同的 ...
- 动态规划(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+ ...
- PAT 甲级 1068 Find More Coins (30 分) (dp,01背包问题记录最佳选择方案)***
1068 Find More Coins (30 分) Eva loves to collect coins from all over the universe, including some ...
随机推荐
- Angular系列文章之angular路由
路由(route),几乎所有的MVC(VM)框架都应该具有的特性,因为它是前端构建单页面应用(SPA)必不可少的组成部分. 那么,对于angular而言,它自然也有内置的路由模块:叫做ngRoute. ...
- Movavi Video Editor 15 Plus(视频编辑软件) 中文版
Movavi Video Editor 15 Plus Mac版是Movavi系列中的一款视频编辑器,Movavi Video Editor Plus 15破解版提供了全面的视频功能,另外还支持为视频 ...
- Spring 基于Session的创建实例
需求 提供一个网页,根据导入的Excel数据计算结果. 第一版本设计 Controller层 @RestController public class QuoteController { privat ...
- Parco_Love_String
二维的kmp直接搞出来emmm, 后缀自动机都没这个快(本弱鸡不会后缀自动机) #include <bits/stdc++.h> using namespace std; #define ...
- 在C#中,Windows Console控制台 设置控制台标题、禁用关闭按钮、关闭快速编辑模式、插入模式
设置控制台标题 禁用关闭按钮 关闭快速编辑模式 关闭插入模式 设置控制台标题.禁用关闭按钮 #region 设置控制台标题 禁用关闭按钮 [DllImport("user32.dll&quo ...
- JavaScript监控页面input输入整数且只能输入2位小数
<input type="text" id="money" /> <script> $(function () { $('#money' ...
- matlab多个曲面如何画在一个坐标系中的疑问
matlab多个曲面如何画在一个坐标系中的疑问 [复制链接] [X,Y]=meshgrid(-3:0.1:3);Z=X.^2+Y.^2;mesh(X,Y,-Z)hold onmesh(X,Y,Z)
- Cpython解释器GIL-多线程执行流程
- Linux资源分析工具杂谈(长文慎入)
Linux资源分析工具杂谈 开篇之前请大家先思考一个问题: 磁盘的平均I/O响应时间是1 ms,这个指标是好,还是差? 众所周知,计算机科学是客观的,也就是说对于一个给定的问题,我们总是 ...
- oracle之数据恢复(delete误删)
ALTER TABLE TA_申请材料表 ENABLE row movement ; flashback table TA_申请材料表 to timestamp to_timestamp('2019- ...