第一篇博客随笔,被迫写的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的更多相关文章

  1. 动态规划——线性dp

    我们在解决一些线性区间上的最优化问题的时候,往往也能够利用到动态规划的思想,这种问题可以叫做线性dp.在这篇文章中,我们将讨论有关线性dp的一些问题. 在有关线性dp问题中,有着几个比较经典而基础的模 ...

  2. 动态规划_线性dp

    https://www.cnblogs.com/31415926535x/p/10415694.html 线性dp是很基础的一种动态规划,,经典题和他的变种有很多,比如两个串的LCS,LIS,最大子序 ...

  3. 线性DP总结(LIS,LCS,LCIS,最长子段和)

    做了一段时间的线性dp的题目是时候做一个总结 线性动态规划无非就是在一个数组上搞嘛, 首先看一个最简单的问题: 一,最长字段和 下面为状态转移方程 for(int i=2;i<=n;i++) { ...

  4. POJ-2346 Lucky tickets(线性DP)

    Lucky tickets Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3298 Accepted: 2174 Descrip ...

  5. CH5102 Mobile Service【线性dp】

    5102 Mobile Service 0x50「动态规划」例题 描述 一个公司有三个移动服务员,最初分别在位置1,2,3处.如果某个位置(用一个整数表示)有一个请求,那么公司必须指派某名员工赶到那个 ...

  6. NOIP2018提高组金牌训练营——动态规划专题

    NOIP2018提高组金牌训练营——动态规划专题 https://www.51nod.com/Live/LiveDescription.html#!#liveId=19 多重背包 二进制优化转化成01 ...

  7. 正睿国庆DAY2动态规划专题

    正睿国庆DAY2动态规划专题 排列-例题 1~n 的排列个数,每个数要么比旁边两个大,要么比旁边两个小 \(f[i][j]\) 填了前i个数,未填的数有\(j\)个比第\(i\)个小,是波峰 \(g[ ...

  8. Nowcoder Removal ( 字符串上的线性 DP )

    题目链接 题意 : 给出长度为 n 的字符串.问你准确删除 m 个元素之后.能产生多少种不同的子串 分析 ( 参考博客 ):  可以考虑线性 DP 解决这个问题 试着如下定义动态规划数组 dp[i][ ...

  9. 非常完整的线性DP及记忆化搜索讲义

    基础概念 我们之前的课程当中接触了最基础的动态规划. 动态规划最重要的就是找到一个状态和状态转移方程. 除此之外,动态规划问题分析中还有一些重要性质,如:重叠子问题.最优子结构.无后效性等. 最优子结 ...

  10. 洛谷P1140 相似基因(线性DP)

    题目背景 大家都知道,基因可以看作一个碱基对序列.它包含了444种核苷酸,简记作A,C,G,TA,C,G,TA,C,G,T.生物学家正致力于寻找人类基因的功能,以利用于诊断疾病和发明药物. 在一个人类 ...

随机推荐

  1. 方法区(Method Area)基础知识

    堆.栈.方法区堆关系 概述 方法区与堆区一样,是各个线程共享的内存区域 方法区在JVM启动时就会被创建,并且它的实际的物理内存空间中和Java堆区一样都可以是不连续的 方法区的大小,跟堆空间一样,可以 ...

  2. IoC基础篇(一)--- Spring容器中Bean的生命周期

    日出日落,春去秋来,花随流水,北雁南飞,世间万物皆有生死轮回.从调用XML中的Bean配置信息,到应用到具体实例中,再到销毁,Bean也有属于它的生命周期. 人类大脑对图像的认知能力永远高于文字,因此 ...

  3. 轻轻松松学CSS:overflow

    一.overflow的定义 overflow,音[əʊvəˈfləʊ],义[溢出],就像2.2米的人躺在1.8米的床上,腿得耷拉到床外一样.overflow 属性用于控制内容溢出容器时显示的方式 二. ...

  4. Java随谈(三)如何创建好一个对象?

    本文推荐阅读时间30分钟 大家都知道,在编写Java程序里,一般就是处理各种各样的对象,那么,你知道一共有多少种创建对象的方式吗? 希望大家能稍微思考一下再往下翻. 答案是4种 new 一个对象 反射 ...

  5. python中闭包详解

    谈谈自己的理解:python中闭包,闭包的实质   闭包这个概念好难理解,身边朋友们好多都稀里糊涂的,稀里糊涂的林老冷希望写下这篇文章能够对稀里糊涂的伙伴们有一些帮助~ 请大家跟我理解一下,如果在一个 ...

  6. 微服务实战系列(八)-网关springcloud gateway自定义规则

    1. 场景描述 先说明下项目中使用的网关是:springcloud gateway, 因需要给各个网关服务系统提供自定义配置路由规则,实时生效,不用重启网关(重启风险大),目前已实现:动态加载自定义路 ...

  7. Java知识系统回顾整理01基础06数组01创建数组

    一.数组定义 定义:数组是一个固定长度的,包含了相同类型数据的 容器 二.声明数组 int[] a; 声明了一个数组变量. []表示该变量是一个数组 int 表示数组里的每一个元素都是一个整数 a 是 ...

  8. nessus 家庭版安装教程(windows)

    1.根据系统选择安装包:https://www.tenable.com/products/nessus/select-your-operating-system 2.申请激活码,在我们安装的时候差不多 ...

  9. 这个网易云JS解密,老网抑云看了都直呼内行

    最近更新频率慢了,这不是因为CK3发售了嘛,一个字就是"肝".今天来看一下网易云音乐两个加密参数params和encSecKey,顺便抓取一波某歌单的粉丝,有入库哦,使用mysql ...

  10. 【基线检查】(高)基线检查--禁用local-infile选项(访问控制)

    (高)基线检查--禁用local-infile选项(访问控制) 描述 禁用local_infile选项会降低攻击者通过SQL注入漏洞器读取敏感文件的能力 检查提示 -- 加固建议 编辑Mysql配置文 ...