恭喜江莉ec final 夺冠

所以昨天高强度看榜 没有写题

dbq QAQ

AcWing 1022. 宠物小精灵之收服

二维费用背包

空间不够我们可以滚动数组优化 不过要反着跑

然后就是体力 j 不能为0 我可以将他看成一个j-1的背包就是了 

反正不可以判断时加j>k这样会忽略从0开始的转化

最后自然check时 0 ~ v2-1 

#include <bits/stdc++.h>
using namespace std;
const int N = 1e3+10;
const int M = 5e4+10;
const int mod = 998244353;
#define int long long
#define endl '\n'
#define Endl '\n'
#define _ 0
#define inf 0x3f3f3f3f3f3f3f3f
#define fast ios::sync_with_stdio(false);cin.tie(nullptr);
int max(int x,int y){return x>y?x:y;}
int min(int x,int y){return x<y?x:y;}
int V1,V2,f[N][N],n;
signed main(){fastcin>>V1>>V2>>n;for(int i=1;i<=n;i++){int v1,v2;cin>>v1>>v2;for(int j=V1;j>=v1;j--)for(int k=V2-1;k>=v2;k--)f[j][k]=max(f[j][k],f[j-v1][k-v2]+1);}cout<<f[V1][V2-1]<<' ';int j;for(j=0;j<=V2-1;j++)if(f[V1][V2-1]==f[V1][j])break;cout<<V2-j<<endl;return ~~(0^_^0);
}

AcWing 278. 数字组合

呃呃 把f[i-1][j]和f[i-1][j-vi]弄一起了 卡了一会

实际上肯定时不行的 

越学越回去了 属于是

#include <bits/stdc++.h>
using namespace std;
const int N = 110;
const int M = 1e4+10;
const int mod = 998244353;
#define int long long
#define endl '\n'
#define Endl '\n'
#define _ 0
#define inf 0x3f3f3f3f3f3f3f3f
#define fast ios::sync_with_stdio(false);cin.tie(nullptr);
int max(int x,int y){return x>y?x:y;}
int min(int x,int y){return x<y?x:y;}
int f[N][M],n,m,a[N];
signed main(){fastcin>>n>>m;for(int i=1;i<=n;i++)cin>>a[i];for(int i=0;i<=n;i++)f[i][0]=1;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){f[i][j]=f[i-1][j];if(j>=a[i])f[i][j]+=f[i-1][j-a[i]];}cout<<f[n][m]<<endl;return ~~(0^_^0);
}

AcWing 1023. 买书

注意j枚举从0开始就是了 因为0的时候我们初始化没到 而把初始化提外面写是能写

要多几行

#include <bits/stdc++.h>
using namespace std;
const int N = 1e3+10;
const int M = 1e4+10;
const int mod = 998244353;
#define int long long
#define endl '\n'
#define Endl '\n'
#define _ 0
#define inf 0x3f3f3f3f3f3f3f3f
#define fast ios::sync_with_stdio(false);cin.tie(nullptr);
int max(int x,int y){return x>y?x:y;}
int min(int x,int y){return x<y?x:y;}
int f[5][N],n,a[5]={0,10,20,50,100};
signed main(){fastcin>>n;f[0][0]=1;for(int i=1;i<=4;i++)for(int j=0;j<=n;j++)for(int k=0;k*a[i]<=j;k++)f[i][j]+=f[i-1][j-k*a[i]];cout<<f[4][n]<<endl;return ~~(0^_^0);
}

AcWing 1021. 货币系统

#include <bits/stdc++.h>
using namespace std;
const int N = 3e3+10;
const int M = 1e4+10;
const int mod = 998244353;
#define int long long
#define endl '\n'
#define Endl '\n'
#define _ 0
#define inf 0x3f3f3f3f3f3f3f3f
#define fast ios::sync_with_stdio(false);cin.tie(nullptr);
int max(int x,int y){return x>y?x:y;}
int min(int x,int y){return x<y?x:y;}
int n,m,f[20][N];
signed main(){fastcin>>n>>m;int a[20];for(int i=1;i<=n;i++)cin>>a[i];f[0][0]=1;for(int i=1;i<=n;i++)for(int j=0;j<=m;j++)for(int k=0;k*a[i]<=j;k++)f[i][j]+=f[i-1][j-k*a[i]];cout<<f[n][m]<<endl;return ~~(0^_^0);
}

AcWing 532. 货币系统

我们不难看出这个题意是让大的数被小的数表示

最开始想的是填表法 多了一维 T了

后来想好像可以刷表 然后 就过了

我们把最开始存的表示成2 能换算过去变成1 

我们只要碰到大于0的就刷一遍

不过只能刷比他小的面值把

这道题就结束咯~~~

#include <bits/stdc++.h>
using namespace std;
const int N = 110;
const int M = 1e4+10;
const int mod = 998244353;
#define int long long
#define endl '\n'
#define Endl '\n'
#define _ 0
#define inf 0x3f3f3f3f3f3f3f3f
#define fast ios::sync_with_stdio(false);cin.tie(nullptr);
int max(int x,int y){return x>y?x:y;}
int min(int x,int y){return x<y?x:y;}signed main(){fastint t;cin>>t;while(t--){int f[25010]={0};int a[N],n;cin>>n;for(int i=1;i<=n;i++)cin>>a[i],f[a[i]]=2;sort(a+1,a+n+1);int cnt=1;for(int i=a[1];i<=a[n];i++){if(f[i]>0){for(int j=1;j<=cnt;j++){if(a[j]+i<=a[n])f[a[j]+i]=1;}}if(i==a[cnt])cnt++;}int ans=0;for(int i=1;i<=n;i++)if(f[a[i]]==2)ans++;cout<<ans<<endl;}return ~~(0^_^0);
}

AcWing 6. 多重背包问题 III

我超

好几把难

暴力我们都会

我看了这道题 他tag说要单调队列 可是我想了半天也没想出来那里可以单调队列

因为我们枚举每个K的时候就是O(1)的 

然后退到j层 是根本和上一层无关的

呃呃

他居然是有个性质 我们%v后是小于v的 然后利用小的 递推过去

并且我们直接还有个(我们就用滚动数组来说啊

f[j]=max(f[j],f[j-v]+w,f[j-2v]+2w...,f[j-sv]+sw)

f[j-v]=max(   f[j-v],     f[j-2v]+w,....f[j-sv]+(s-1)w,f[j-(s+1)v]+sw)

f[j-2v]=...

f[j-3v]=...

这里也就是我们为什么不能用完全背包的来优化 因为完全背包是固定了s项 没有s+1项的

然后我们发现我们每个j-kv都是求前s个的max

这不就单调队列吗!

经过单调队列优化我们的时间复杂度O(nm)(因为可以把里面两层优化成线性

然后就是很重要的一点我们每次f[j-kv]后面加的w都是不同的

我们设余数为r

f[r]=max(f[r])

f[r+v]=max(f[r+v],f[r+v-v]+w)

f[r+2v]=max(f[r+2v],f[r+2v-v]+w,f[r+2v-2v]+2w)

我们把里面都减去合适kw

f[r]=max(f[r])

f[r+v]=max(f[r+v]-w,f[r])+w

f[r+2v]=max(f[r+2v]-2w,f[r+v]-w,f[r])+2w

当然我们入队比较的时候随便比比只要相对不变就是了

但是入队时应该严格的绝对值入队那就是当前的(k-dq.front)/v*w

当然你可以把这个max(f[r+2v]-2w,f[r+v]-w,f[r])拿去入队 当然出来的时候就要加上kw

#include <bits/stdc++.h>
using namespace std;
const int N = 2e4+10;
const int M = 1e4+10;
const int mod = 998244353;
#define int long long
#define endl '\n'
#define Endl '\n'
#define _ 0
#define inf 0x3f3f3f3f3f3f3f3f
#define fast ios::sync_with_stdio(false);cin.tie(nullptr);
int max(int x,int y){return x>y?x:y;}
int min(int x,int y){return x<y?x:y;}
int f[N],backup[N];
signed main(){fastint n,m;cin>>n>>m;for(int i=1;i<=n;i++){int v,w,s;cin>>v>>w>>s;memcpy(backup,f,sizeof f);for(int j=0;j<v;j++){int dq[N];int tt=-1,hh=0;for(int k=j;k<=m;k+=v){while(hh<=tt&&dq[hh]<k-s*v)hh++;while(hh<=tt&&backup[dq[tt]]-(dq[tt]-j)/v*w<=backup[k]-(k-j)/v*w)tt--;dq[++tt]=k;if(hh<=tt)f[k]=max(f[k],backup[dq[hh]]+(k-dq[hh])/v*w);}}}cout<<f[m]<<endl;return ~~(0^_^0);
}

AcWing 1019. 庆功会

一模一样 我甚至数据范围都没改

#include <bits/stdc++.h>
using namespace std;
const int N = 2e4+10;
const int M = 1e4+10;
const int mod = 998244353;
#define int long long
#define endl '\n'
#define Endl '\n'
#define _ 0
#define inf 0x3f3f3f3f3f3f3f3f
#define fast ios::sync_with_stdio(false);cin.tie(nullptr);
int max(int x,int y){return x>y?x:y;}
int min(int x,int y){return x<y?x:y;}
int f[N],backup[N];
signed main(){fastint n,m;cin>>n>>m;for(int i=1;i<=n;i++){int v,w,s;cin>>v>>w>>s;memcpy(backup,f,sizeof f);for(int j=0;j<v;j++){int dq[N];int tt=-1,hh=0;for(int k=j;k<=m;k+=v){while(hh<=tt&&dq[hh]<k-s*v)hh++;while(hh<=tt&&backup[dq[tt]]-(dq[tt]-j)/v*w<=backup[k]-(k-j)/v*w)tt--;dq[++tt]=k;if(hh<=tt)f[k]=max(f[k],backup[dq[hh]]+(k-dq[hh])/v*w);}}}cout<<f[m]<<endl;return ~~(0^_^0);
}

ACWing 7. 混合背包问题

处理一下输入就是了

#include <bits/stdc++.h>
using namespace std;
const int N = 2e4+10;
const int M = 1e4+10;
const int mod = 998244353;
#define int long long
#define endl '\n'
#define Endl '\n'
#define _ 0
#define inf 0x3f3f3f3f3f3f3f3f
#define fast ios::sync_with_stdio(false);cin.tie(nullptr);
int max(int x,int y){return x>y?x:y;}
int min(int x,int y){return x<y?x:y;}
int f[N],backup[N];
signed main(){fastint n,m;cin>>n>>m;for(int i=1;i<=n;i++){int v,w,s;cin>>v>>w>>s;if(s==0)s=2e9;else if(s==-1)s=1;memcpy(backup,f,sizeof f);for(int j=0;j<v;j++){int dq[N];int tt=-1,hh=0;for(int k=j;k<=m;k+=v){while(hh<=tt&&dq[hh]<k-s*v)hh++;while(hh<=tt&&backup[dq[tt]]-(dq[tt]-j)/v*w<=backup[k]-(k-j)/v*w)tt--;dq[++tt]=k;if(hh<=tt)f[k]=max(f[k],backup[dq[hh]]+(k-dq[hh])/v*w);}}}cout<<f[m]<<endl;return ~~(0^_^0);
}

AcWing 8. 二维费用的背包问题

看错题了 这也能难度中等???

我说再加一维k都称不上把呃呃

#include <bits/stdc++.h>
using namespace std;
const int N = 1e3+10;
const int M = 1e4+10;
const int mod = 998244353;
#define int long long
#define endl '\n'
#define Endl '\n'
#define _ 0
#define inf 0x3f3f3f3f3f3f3f3f
#define fast ios::sync_with_stdio(false);cin.tie(nullptr);
int max(int x,int y){return x>y?x:y;}
int min(int x,int y){return x<y?x:y;}
int f[N][N],n,V1,V2;
signed main(){fastcin>>n>>V1>>V2;for(int i=1;i<=n;i++){int w,v1,v2;cin>>v1>>v2>>w;for(int i=V1;i>=1;i--)for(int j=V2;j>=0;j--)if(i>=v1&&j>=v2)f[i][j]=max(f[i][j],f[i-v1][j-v2]+w);}cout<<f[V1][V2]<<endl;return ~~(0^_^0);
}

1020. 潜水员

暴力写挂了 这题数据真不水

大概是1600*1600*1000感觉可以卡着过的

这道题唯一区别就是状态计算吧

要是小于的话我们还是要算进去的吧

#include <bits/stdc++.h>
using namespace std;
const int N = 1610;
const int M = 1e4+10;
const int mod = 998244353;
#define int long long
#define endl '\n'
#define Endl '\n'
#define _ 0
#define inf 0x3f3f3f3f3f3f3f3f
#define fast ios::sync_with_stdio(false);cin.tie(nullptr);
int max(int x,int y){return x>y?x:y;}
int min(int x,int y){return x<y?x:y;}
int f[N][N],n,V1,V2;
signed main(){fastcin>>V1>>V2>>n;memset(f,0x3f3f,sizeof f);f[0][0]=0;for(int i=1;i<=n;i++) {int v1, v2, w;cin >> v1 >> v2 >> w;for (int j = V1; j >= 0; j--)for (int k = V2; k >= 0; k--)f[j][k] = min(f[j][k], f[max(0, j - v1)][max(0, k - v2)] + w);}cout<<f[V1][V2]<<endl;return ~~(0^_^0);
}

ACW 各种背包模型题 day36相关推荐

  1. 数字三角形,最长上升子序列,背包模型 AcWing算法提高课 (详解)

    目录 数字三角形模型(只能向右和向下或向左和向上) AcWing 1015. 摘花生 AcWing 1018. 最低通行费(曼哈顿距离-向右和向下-求最小值-初始化) AcWing 1027. 方格取 ...

  2. 动态规划之背包模型及其扩展应用

    背包模型 前言 背包问题的初始化问题 01背包 装箱问题 宠物小精灵之收服 数字组合 开心的金明 01背包+贪心 背包问题求解方案数 货币系统 货币系统Ⅱ 多重背包问题 庆功会 混合背包问题 二维费用 ...

  3. HDU 1248 寒冰王座(全然背包:入门题)

    HDU 1248 寒冰王座(全然背包:入门题) http://acm.hdu.edu.cn/showproblem.php?pid=1248 题意: 不死族的巫妖王发工资拉,死亡骑士拿到一张N元的钞票 ...

  4. Codeforces Round #104 (Div. 2) E DP(01背包模型) +组和+除法取模求逆元

    题意: 规定只包含4或7的数为幸运数字,给定n个数的序列,求他的子序列,使得该子序列的长度为k并且满足该子序列中不存在相同的两个幸运数字.问一共寻在多少种可能.(只要该数的下标不同则认为是不同的序列) ...

  5. Jam's balance HDU - 5616 (01背包基础题)

    Jim has a balance and N weights. (1≤N≤20) The balance can only tell whether things on different side ...

  6. 一本通 1270:【例9.14】混合背包(混合背包模板题)

    [题目描述] 一个旅行者有一个最多能装V公斤的背包,现在有n件物品,它们的重量分别是W1,W2,-,Wn,它们的价值分别为C1,C2,-,Cn.有的物品只可以取一次(01背包),有的物品可以取无限次( ...

  7. 装箱问题(01背包模型)

    题意: 有一个箱子容量为 V,同时有 n 个物品,每个物品有一个体积(正整数). 要求 n 个物品中,任取若干个装入箱内,使箱子的剩余空间为最小. 输入格式 第一行是一个整数 V,表示箱子容量. 第二 ...

  8. 动态规划问题之背包模型(18题)

    背包问题是动态规划问题的一大类型,下面我们对这个进行总结. 以 Acwing y中总结的 几个类型,我写了几个题解 应用知识点 01背包.完全背包 空间压缩的写法 多维费用的背包问题,以及状态的不同表 ...

  9. HDU 2546 饭卡(01背包裸题)

    饭卡 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...

最新文章

  1. debian10 dhcp简单配置
  2. 爱上MVC3系列~开发一个站点地图(俗称面包屑)
  3. 洛谷2505 [HAOI2012]道路(最短路计数)
  4. Gradle修改本地仓库的位置
  5. 序列化与反序列化_序列化和反序列化JAVA成长之路
  6. 成功解决 class 'AttributeError' : 'Editor' object has no attribute '_Editor__markerMap'
  7. 使用vue.js devtools遇到的磕磕绊绊
  8. 迭代器 生成器 装饰器 匿名函数
  9. eclipse下使用git插件上传代码至github
  10. 如何使用Secure CRT连接到华三模拟器上和华为模拟器上(更新模拟器版本,SecureCRT版本)
  11. linux下修改文件权限.
  12. 推荐系统中的前沿技术研究与落地:深度学习、AutoML与强化学习 | AI ProCon 2019
  13. python显示安装失败_Win7安装Python失败 提示Setup failed
  14. 网站添加错误页面提示功能(404、500错误提示)
  15. Spark history server fails to render compressed inprogress history file in some cases
  16. 毕业论文开题报告撰写指南-宾夕法尼亚州立大学研究生写作中心
  17. 谁挡道就骂谁,这个暴躁版扫地机器人火了,东北话也可以,网友:想劈了它...
  18. window8系统 dns有问题怎么修复,浏览器代理设置,浏览器提示网页无法显示
  19. java利用poi导出excel功能-附带图片导出
  20. 网络WireShark进行抓包

热门文章

  1. nodejs-Joi模块
  2. CSS::marker让文字序号不再呆板
  3. 视频教程-用友U8视频教程全集(系统管理)-ERP
  4. ANSYS workbench 19.0基础到实例仿真分析视频教程
  5. nessus无限ip扫描w10版
  6. 形如:1/a 的分数称为单位分数。 可以把1分解为若干个互不相同的单位分数之和。
  7. 车险保单在线OCR识别,字段很全,可以可以
  8. Win10笔记本上WLAN不见了怎么找回
  9. 【科学文献计量】外文文献及中文文献关键词的挖掘与可视化
  10. 再谈哥德尔不完备定理