动态规划专题一:线性dp
第一篇博客随笔,被迫写的bushi
上课讲的动态规划入门,还是得总结一下吧
背包
01背包
背包有容量限制,每一件物品只能够取一件(这就是为什么j从V至v[i]循环的原因)
思路:f数组表示当前状态的最佳情况,每一种物品就对应两种状态 1.选 2.不选,这样状态转移方程就出来了
1 #include<bits/stdc++.h>
2 using namespace std;
3 int N,V;
4 int v[10009],w[10009],f[50009];//v是物品的体积,w是物体的价值
5 int main(){
6 cin>>V>>N;
7 for(int i=1;i<=N;i++){
8 cin>>v[i]>>w[i];
9 w[i]*=v[i];
10 }
11 for(int i=1;i<=N;i++)
12 for(int j=V;j>=v[i];j--)
13 f[j]=max(f[j],f[j-v[i]]+w[i]);
14 cout<<f[V];
15 return 0;
16 }
完全背包
背包有容量限制,每一件物品能够取无数件(这就是为什么j从v[i]至V循环的原因)注意与01背包进行区分
思路:f数组表示当前状态的最佳情况(一样的),每一种物品就不止对应两种状态了,这就是与01背包的本质区别。所以状态转移方程不变,就只需要改变循环遍历的顺序啦
1 #include<bits/stdc++.h>
2 using namespace std;
3 int N,V;
4 int v[1005],w[1005],f[1005];//v是物品的体积,w是物品的价值
5 int main(){
6 cin>>N>>V;
7 for(int i=1;i<=N;i++) cin>>v[i]>>w[i];
8 for(int i=1;i<=N;i++)
9 for(int j=v[i];j<=V;j++)
10 f[j]=max(f[j],f[j-v[i]]+w[i]);
11 cout<<f[V];
12 return 0;
13 }
多重背包
背包有容量限制,每一件物品能够取规定数件(所以要拆分成01背包 啊这就是思路)三种做法:1直接拆分2二进制拆分3单调队列(因为太菜,单调队列代码以后贴)a bushi
1直接拆分
1 #include<bits/stdc++.h>
2 using namespace std;
3 int n,m;
4 int f[10000002],v[1000005],w[1000005],c[1000005];
5 int main(){
6 cin>>n>>m;
7 for(int i=1;i<=n;i++)
8 cin>>v[i]>>w[i]>>c[i];
9 f[0]=0;//v是价值,w是体积
10 for(int i=1;i<=n;i++){
11 for(int j=1;j<=c[i];j++){
12 for(int k=m;k>=w[i];k--)
13 f[k]=max(f[k],f[k-w[i]]+v[i]);
14 }
15 }
16 cout<<f[m];
17 return 0;
18 }
2二进制拆分(注意输入时的预处理拆分)
1 #include<bits/stdc++.h>
2 using namespace std;
3 int n,m,fl=1;
4 int f[10000002],v[1000005],w[1000005],c[1000005];
5 int main(){
6 cin>>n>>m;
7 for(int i=1;i<=n;i++){
8 int x,y,z;
9 cin>>x>>y>>z;
10 for(int j=1;j<=z;j=j<<1){
11 v[++fl]=j*x;w[fl]=j*y;
12 z-=j;
13 }
14 if(z>0) v[++fl]=x*z,w[fl]=y*z;
15 }
16 for(int i=1;i<=fl;i++){
17 for(int j=m;j>=w[i];j--){
18 f[j]=max(f[j],f[j-w[i]]+v[i]);
19 }
20 }
21 cout<<f[m];
22 return 0;
23 }
3单调队列(坑待填)
分组背包
背包有容量限制,每一组最多取一件物品
1 #include<bits/stdc++.h>
2 using namespace std;
3 int w[50],c[50],v,n,t,a[11][31],f[220];
4 int main(){
5 cin>>v>>n>>t;
6 for(int i=1;i<=n;i++){
7 int x;
8 cin>>w[i]>>c[i]>>x;
9 a[x][0]++;
10 a[x][a[x][0]]=i;
11 }
12 for(int k=1;k<=t;k++){
13 for(int j=v;j>=0;j--){
14 for(int p=1;p<=a[k][0];p++){
15 if(j>=w[a[k][p]]) f[j]=max(f[j-w[a[k][p]]]+c[a[k][p]],f[j]);
16 }
17 }
18 }
19 cout<<f[v];
20 return 0;
21 }
混合背包
就是把以上四种背包问题揉成了一道题,就分类讨论啊
就不贴代码了,贴一道题吧
基本上就这些了吧,遇到问题再更新吧
动态规划专题一:线性dp的更多相关文章
- 动态规划——线性dp
我们在解决一些线性区间上的最优化问题的时候,往往也能够利用到动态规划的思想,这种问题可以叫做线性dp.在这篇文章中,我们将讨论有关线性dp的一些问题. 在有关线性dp问题中,有着几个比较经典而基础的模 ...
- 动态规划_线性dp
https://www.cnblogs.com/31415926535x/p/10415694.html 线性dp是很基础的一种动态规划,,经典题和他的变种有很多,比如两个串的LCS,LIS,最大子序 ...
- 线性DP总结(LIS,LCS,LCIS,最长子段和)
做了一段时间的线性dp的题目是时候做一个总结 线性动态规划无非就是在一个数组上搞嘛, 首先看一个最简单的问题: 一,最长字段和 下面为状态转移方程 for(int i=2;i<=n;i++) { ...
- POJ-2346 Lucky tickets(线性DP)
Lucky tickets Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3298 Accepted: 2174 Descrip ...
- CH5102 Mobile Service【线性dp】
5102 Mobile Service 0x50「动态规划」例题 描述 一个公司有三个移动服务员,最初分别在位置1,2,3处.如果某个位置(用一个整数表示)有一个请求,那么公司必须指派某名员工赶到那个 ...
- NOIP2018提高组金牌训练营——动态规划专题
NOIP2018提高组金牌训练营——动态规划专题 https://www.51nod.com/Live/LiveDescription.html#!#liveId=19 多重背包 二进制优化转化成01 ...
- 正睿国庆DAY2动态规划专题
正睿国庆DAY2动态规划专题 排列-例题 1~n 的排列个数,每个数要么比旁边两个大,要么比旁边两个小 \(f[i][j]\) 填了前i个数,未填的数有\(j\)个比第\(i\)个小,是波峰 \(g[ ...
- Nowcoder Removal ( 字符串上的线性 DP )
题目链接 题意 : 给出长度为 n 的字符串.问你准确删除 m 个元素之后.能产生多少种不同的子串 分析 ( 参考博客 ): 可以考虑线性 DP 解决这个问题 试着如下定义动态规划数组 dp[i][ ...
- 非常完整的线性DP及记忆化搜索讲义
基础概念 我们之前的课程当中接触了最基础的动态规划. 动态规划最重要的就是找到一个状态和状态转移方程. 除此之外,动态规划问题分析中还有一些重要性质,如:重叠子问题.最优子结构.无后效性等. 最优子结 ...
- 洛谷P1140 相似基因(线性DP)
题目背景 大家都知道,基因可以看作一个碱基对序列.它包含了444种核苷酸,简记作A,C,G,TA,C,G,TA,C,G,T.生物学家正致力于寻找人类基因的功能,以利用于诊断疾病和发明药物. 在一个人类 ...
随机推荐
- 在自己win系统里面给idea配置Git
这里直接是写好的步骤 下载链接
- 6.Kafka消息流处理
- 基于Springboot+Mybatis+Element UI开发的钢贸供应链系统
小蓝钢贸云供应链系统以销售.采购.库存及财务一体化的设计理念,从供应商到客户的销售流程,实现订单.货物.资金的全面管控,并能对成本进行准确的跟踪与分析,为销售决策提供依据. 基于SpringBoot2 ...
- 这10道springboot常见面试题你需要了解下
1.什么是Spring Boot? 多年来,随着新功能的增加,spring变得越来越复杂.只需访问https://spring.io/projects页面,我们就会看到可以在我们的应用程序中使用的 ...
- IDEA搭建多模块maven项目
目录 新建maven项目作为多模块的parent项目 新建模块 在parent项目中配置 pom api 模块搭建restful风格api Mybatis Generator的使用(mybatis 逆 ...
- vue移动端记录列表滚动如何快速找到是哪个元素产生的滚动
使用下面的代码粘贴到调试工具中运行一下,然后滚动页面,就可以看到是哪个元素产生的滚动了 function findscroller(element) { element.onscroll = func ...
- GZip 压缩解压 工具类 [ GZipUtil ]
片段 1 片段 2 pom.xml <dependency> <groupId>commons-codec</groupId> <artifactId> ...
- 烦人的Null,你可以走开点了
1. Null 的问题 假设现在有一个需要三个参数的方法.其中第一个参数是必须的,后两个参数是可有可无的. 第一种情况,在我们调用这个方法的时候,我们只能传入两个参数,对第三个参数,我们在上下文里是没 ...
- Centos-服务管理-systemctl
systemctl命令属于systemd软件包,这个软件包不仅可以完成系统的初始化工作,还能对系统和服务进行管理 在centos7中,服务单元取代启动脚本,服务单元以.service为文件扩展名,配置 ...
- java泛型之通配符?
一.在说泛型通配符" ?" 之前先讲几个概念 1.里氏替换原则(Liskov Substitution Principle, LSP): 定义:所有引用基类(父类)的地方必须能透明 ...