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 ...
随机推荐
- netty例子
流式编程 客户端 这里MessageToByteEncoder继承于outchanel 服务端
- opencart3修改产品页模板没有效果的原因排查
这几天在opencart 3模板时发生了一个很奇怪的事情,ytkah明明已经将product.twig模板修改了,但是前端产品页就是没有变化,后台刷新缓存了也不起左右.后面想着把模板重命名成produ ...
- 20175313 张黎仙《Java程序设计》第九周学习总结
目录 学号 20175313 <Java程序设计>第九周学习总结 一.教材学习内容总结 二.教材学习中的问题和解决过程 三.代码托管 四.心得体会 五.学习进度条 六.参考资料 学号 20 ...
- dependent object 和root object
dependent object 是root object 下面的字节点.每个节点被访问,都要通过 root object 进入.
- 详解iBaits中SqlMapClientTemplate的使用
Apache iBatis(现已迁至Google Code下发展,更名为MyBatis)是当前IT项目中使用很广泛的一个半自动ORM框架,区别于Hibernate之类的全自动框架,iBatis对数据库 ...
- cycle标签和random两种方式美化表格
一:cycle标签实现给表格变色 1. <style>标签里写好需要的颜色 2. 在要变色的地方(行/列)加固定的语句,按照顺序依次执行 代码: <!DOCTYPE html> ...
- Java-对象及变量的并发访问小结
1)多线程环境下,方法内的变量是线程安全的 2)多个线程同时处理一个实例,这个实例内的变量是不安全的 3)不同线程中注入同一个类的不同实例,实例中的变量是安全的 4)Synchronized获取到的锁 ...
- java项目word文件转html文件
最近在项目开发中用户提出要在电脑上没有装office时在浏览器中打开word文件,最后确定的逻辑:用户选择想要查看的文件,页面js判断文件是否为word.不是执行下载,是后端根据word文件后缀访问对 ...
- flutter 读写文件
import 'package:flutter/material.dart'; import 'package:path_provider/path_provider.dart'; import 'd ...
- Linux退出状态码
命令成功结束 一般性未知错误 不适合的shell命令 命令不可执行 没找到命令 无效的退出参数 +x 与Linux信号x相关的严重错误 通过Ctrl+C终止的命令 正常范围之外的退出状态码