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 ...
随机推荐
- P3803 【模板】多项式乘法(FFT)
传送门: 参考博客 1:大佬 attack 参考博客 2:大佬 胡小兔 在这里再膜拜一下这两位大佬 Orz%%% #include<iostream> #include<cstd ...
- webpack基础小结。
想写写webpack的学习体验的小结,加深自己的理解和使用技能,顺便过一下文档(4.0的功能感觉还是满好玩的). 本文主简写描述webpack中对各种文件的简单处理 基本知识点 处理js 加载css文 ...
- 编年史:OI测试
2019.4.18 t1:给出不定方程ax+by+c=0,求x在x1~x2并且y在y1~y2时的解个数.考场上想的是一个扩欧板子敲下去,然后构造出x>=x1的最小解,同时得出y,然后通过通项来枚 ...
- C++模板的要点
1.函数模板与普通函数的区别: 普通函数可以进行自动类型转化,而函数模板不可以. 举个例子 //函数模板 template<class T> void show(T a,T b){ cou ...
- 蓝桥杯近三年决赛题之一(15年B组)
自己计时4小时做了试试,发现只用了2个小时多一点,第二题和第六题实在没办法,不会做,第五题用了暴力(过不了多少数据),其他三题在网上看了看 应该都是对的,下面放上试题及答案. 1. 标题:积分之迷 小 ...
- 001-ADO.NET
Web.config <connectionStrings> <add name="connStr" connectionString="server= ...
- 轻量级集群管理软件-Ansible
ansible概述和运行机制 ansible概述 Ansible是一款为类Unix系统开发的自由开源的配置和自动化工具, 它用Python写成,类似于saltstack和Puppet,但是有一个不同 ...
- Java IO和Java NIO 和通道 在文件拷贝上的性能差异分析
1. 在JAVA传统的IO系统中,读取磁盘文件数据的过程如下: 以FileInputStream类为例,该类有一个read(byte b[])方法,byte b[]是我们要存储读取到用户空间的缓冲区 ...
- 使用4K分辨率,然后放大DIP200%,软件界面异常.
简单:WFM主界面.AutoScaleMode 选中DIP,然后使用表格容器,容器分割,容器.就可以快速迁移旧程序. 复杂点:读取桌面分辨率,DIP放大....
- react context跨组件传递信息
从腾讯课堂看到的一则跨组件传递数据的方法,贴代码: 使用步骤: 1.在产生参数的最顶级组建中,使用childContextTypes静态属性来定义需要放入全局参数的类型 2.在父组件中,提供状态,管理 ...