浅谈\(DP\):https://www.cnblogs.com/AKMer/p/10437525.html

题目传送门:https://www.luogu.org/problemnew/show/P1048

像这种给你\(n\)个物品,每个物品有占用体积和价值,求\(m\)体积的背包能装下的最大的价值的问题就是\(01\)背包问题。

我们可以设\(f[i][j]\)表示从前\(i\)个物品中选取一些占用\(j\)的体积可以装的最大的价值。

那么转移如下:

\(f[i][j]=f[i-1][j](j<weight_i)\)

\(f[i][j]=max(f[i][j],max(f[i-1][j],f[i-1][j-weight_i]+value_i))(weight_i\leqslant j \leqslant m)\)

时间复杂度:\(O(nm)\)

空间复杂度:\(O(nm)\)

代码如下:

#include <cstdio>
#include <algorithm>
using namespace std; const int maxT=1005,maxm=105; int T,m;
int f[maxm][maxT]; int read() {
int x=0,f=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
} int main() {
T=read(),m=read();
for(int i=1;i<=m;i++) {
int tim=read(),val=read();
for(int j=0;j<tim;j++)f[i][j]=f[i-1][j];
for(int j=tim;j<=T;j++)
f[i][j]=max(f[i][j],max(f[i-1][j],f[i-1][j-tim]+val));
} printf("%d\n",f[m][T]);
return 0;
}

但是实际上我们可以把第一维省掉,然后倒着枚举体积。因为体积大的状态总是由体积小的状态更新得来,所以我倒着枚举体积实际上还是用的\(i-1\)个物品的状态来更新我当前加入第\(i\)个物品之后的状态。

时间复杂度:\(O(nm)\)

空间复杂度:\(O(m)\)

代码如下:

#include <cstdio>
#include <algorithm>
using namespace std; const int maxT=1005,maxm=105; int T,m;
int f[maxT]; int read() {
int x=0,f=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
} int main() {
T=read(),m=read();
for(int i=1;i<=m;i++) {
int tim=read(),val=read();
for(int j=T;j>=tim;j--)
f[j]=max(f[j],f[j-tim]+val);
}
printf("%d\n",f[T]);
return 0;
}

洛谷【P1048】采药的更多相关文章

  1. 洛谷P1048 采药

    题目OJ地址 https://www.luogu.org/problemnew/show/P1048 https://vijos.org/p/1104 题目描述辰辰是个天资聪颖的孩子,他的梦想是成为世 ...

  2. 洛谷 P1048 采药【裸01背包】

    题目描述 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师.为此,他想拜附近最有威望的医师为师.医师为了判断他的资质,给他出了一个难题.医师把他带到一个到处都是草药的山洞里对他说:" ...

  3. 洛谷 P1048 采药

    采药 01背包模板题. #include <iostream> #include <cstdio> using namespace std; //Mystery_Sky //一 ...

  4. 洛谷P1048 采药 二维dp化一维

    题目描述 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师.为此,他想拜附近最有威望的医师为师.医师为了判断他的资质,给他出了一个难题.医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个 ...

  5. 洛谷P1048采药题解

    题目 这是一个裸的01背包,因为题目中没说可以采好多次,不多说上代码, #include<iostream> using namespace std; int main() { int n ...

  6. 洛谷P1048采药

    这道题一看就知道是01背包,我门用f[i]来表示时间剩余i时的最大的价值 一共只有两种选择取或者不取,可以得到方程式f[i]=max(f[i],f[i-a[i]]+v[i])(a[i]是表示时间,v[ ...

  7. 动态规划 洛谷P1048 [NOIP2005 普及组] 采药

    洛谷P1048 [NOIP2005 普及组] 采药 洛谷的一个谱架-的题目,考的是01背包问题,接下来分享一下我的题解代码. AC通过图: 我的代码: 1 //动态规划 洛谷P1048 [NOIP20 ...

  8. P1048 采药(洛谷,动态规划递推,01背包原题)

    题目直接放链接 P1048 采药 这题只是01背包+背景故事而已 原题来的 PS:我写了一篇很详细的01背包说明,如果下面ac代码有看不懂的地方可以去看看 对01背包的分析与理解(图文) 下面上ac代 ...

  9. 动态规划 洛谷P1616 疯狂的采药

    动态规划 洛谷P1616 疯狂的采药 同样也是洛谷的动态规划一个普及-的题目,接下来分享一下我做题代码 看到题目,没很认真的看数据大小,我就提交了我的代码: 1 //动态规划 洛谷P1616 疯狂的采 ...

  10. 洛谷1640 bzoj1854游戏 匈牙利就是又短又快

    bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...

随机推荐

  1. awk的内置函数

    常见awk内置数值函数

  2. 超酷Loading进度条

    在线演示 本地下载

  3. 对matrix,dataframe的操作函数

    1.每行(列)的平均值:rowMeans() ; colMeans() 输入:数值型矩阵:数值型数据框 输出:向量 2.每行(列)的总和:rowSums() ;colSums() 输入:数值型矩阵,数 ...

  4. mybatis 一对多和多对一

      在学习MyBatis3的过程中,文档上面一直在强调一个id的东西!在做这个实验的时候,也因为没有理解清楚id含义而导致一对多的“多”中也只有一条数据.id和result的唯一不同是id表示的结果将 ...

  5. how to use Inspector in fiddler

    打开fiddler之后,会自动捕获本机的http请求,以列表的形式显示在左侧 双击左侧列表中的某一个request,右侧会自动切换到Inspectors窗口. 右侧上半部分是request的raw G ...

  6. 软件体系结构C2风格

    首先C2风格是最常用的一种软件体系结构风格.(下图为一个C2风格的架构图) C2是一种基于构件和消息的架构风格,可用于创建灵活的.可伸缩的软件系统.一个C2构架可以看成是按照一定规则由连接件连接的许多 ...

  7. R语言学习笔记(4)

    第四章:基本数据管理 一 贯穿整章的示例 二 变量的创建.重编码和重命名 三 日期值与缺失值 四 数据类型和类型转换 五 数据集的排序.合并与取子集 一 贯穿整章的示例(leadership)  ,, ...

  8. 【转】Android应用中使用AsyncHttpClient来异步网络数据

    摘要: 首先下载AsyncHttpClient的库文件,可以自行搜索,可以到下面地址下载 http://download.csdn.net/detail/xujinyang1234/5767419 测 ...

  9. skynet中动态库的处理

    skynet中的.so动态库由service-src中的c文件编译完后生成,其中最重要的是snlua.c. 源码地址:https://github.com/cloudwu/skynet/service ...

  10. 利用RandomAccessFile类在指定文件指定位置插入内容

    package File; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; ...