第一篇博客随笔,被迫写的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. python爬取链家二手房信息,确认过眼神我是买不起的人

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 python免费学习资 ...

  2. 深入理解HBase

    深入理解HBase: https://www.jianshu.com/p/b23800d9b227

  3. PHP绕过disable_function

    PHP绕过disable_function 常规绕过 exec exec执行command命令,但是不会输出全部结果,而是返回结果的最后一行. 想得到全部的结果,可以使用第二个参数,让其输出到一个数组 ...

  4. burp suite 之 intruder(入侵者)

    intruder:包括自动提交请求的功能 登录密码 撞库 注入 脱裤 Fuzz Burp intruder包含四个模块: Target:攻击的网站目标的详情信息 Positions :用来设置攻击类型 ...

  5. Typora操作总结

    Typora 1. Markdown 是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档 1.1 目录  [toc] 2. 结构类操作 2.1 多级标题  #       一级标题   ...

  6. ucore操作系统学习笔记(一) ucore lab1系统启动流程分析

    一.ucore操作系统介绍 操作系统作为一个基础系统软件,对下控制硬件(cpu.内存.磁盘网卡等外设),屏蔽了底层复杂多样的硬件差异:对上则提供封装良好的应用程序接口,简化应用程序开发者的使用难度.站 ...

  7. Java基础——克隆

    1.克隆 假设有一个对象object1,在某处又需要一个跟object1一样的实例object2,这两个对象是绝对独立的,不会因为某一个修改另一个随之改变,这样,我们不能直接将对象objec1t的引用 ...

  8. PageObject课程培训记录

    前言 昨晚的培训课程讲了PO设计模式,对于PO模式我们需要去了解关于为什么要使用PO,而不使用PO是什么情况?什么是PO模式?PO怎么去使用? 第一,为什么要使用PO,而不使用PO是什么情况? 我们先 ...

  9. python3 连接数据库~

    ~目前记录的是针对python3写的数据库连接,不适用于pyhon2.python3如果想要与数据库进行连接,则需要先下载对应各数据库的插件包,然后导入包.python3的插件下载地址:https:/ ...

  10. 简化ETL工作,编写一个Canal胶水层

    前提 这是一篇憋了很久的文章,一直想写,却又一直忘记了写.整篇文章可能会有点流水账,相对详细地介绍怎么写一个小型的"框架".这个精悍的胶水层已经在生产环境服役超过半年,这里尝试把耦 ...