背包模拟

概况

主要对有限背包、完全背包、背包记录方案、有依赖背包进行了考查,重点在于考察学生对于背包模型的灵活运用以及学生对背包板子的熟练度

A.PACK

思路:

二维背包板子,还好数据小

代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
inline ll read(){ll x=0,f=1;char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=x*10+c-'0';c=getchar();}return x*f;
}
ll dp[1005][1005],t[1005],v[1005],g[1005];
int main(){ll V=read(),G=read(),n=read();for(int i=1;i<=n;i++){t[i]=read();v[i]=read();g[i]=read();}for(int i=1;i<=n;i++)for(int j=V;j>=v[i];j--)for(int k=G;k>=g[i];k--)dp[j][k]=max(dp[j][k],dp[j-v[i]][k-g[i]]+t[i]);printf("%lld",dp[V][G]);return 0;
}

B.DIABLO

思路:

求解最优值部分为有限背包板子,对于记录方案,这是个我一直以来都没太学会的东西,最后在f神的帮助下完成了,大概思路如下:对于第i件物品,我们记录它在剩余为j被选择时的件数k,然后从总费用开始递归输出,要注意的是这里总费用不一定是给出的,而有可能更小,这时就需要提前处理

代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
inline ll read(){ll x=0,f=1;char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=x*10+c-'0';c=getchar();}return x*f;
}
ll dp[1005],c[1005],p[1005],w[1005][1005],pre[1005][10005];
void print(int now_n,int now_dp){if(now_n==0)return;print(now_n-1,now_dp-pre[now_n][now_dp]*c[now_n]);printf("%lld\n",pre[now_n][now_dp]);
}
int main(){ll n=read(),m=read();for(int i=1;i<=n;i++){c[i]=read();p[i]=read();for(int j=1;j<=p[i];j++)w[i][j]=read();}for(int i=1;i<=n;i++)for(int j=m;j>=c[i];j--)for(int k=1;k<=p[i]&&k*c[i]<=j;k++){if(dp[j-k*c[i]]+w[i][k]>dp[j]){dp[j]=dp[j-k*c[i]]+w[i][k];pre[i][j]=k;}}while(dp[m]==dp[m-1]) m--;printf("%lld\n",dp[m]);print(n,m);return 0;
}

收获:

1.背包方案记录
2.递归输出方案

C.MANOR

思路:

显然对于这道题,体力和时间的限制是一定的,每个格子的体力和时间是一定的并且是一致的,于是我们只需要对每个格子的消耗进行预处理,进行有限背包即可

代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
inline ll read(){ll x=0,f=1;char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=x*10+c-'0';c=getchar();}return x*f;
}
ll dp[1005],c[1005][1005],v[1005][1005],t[1005][1005];
int main(){ll n=read(),m=read(),ti=read(),a=read();for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)v[i][j]=read(),c[i][j]=(i+j)*2;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)t[i][j]=read();for(int x=1;x<=n;x++)for(int y=1;y<=m;y++)for(int j=min(ti,a-1);j>=c[x][y];j--)for(int k=1;k<=t[x][y]&&k*c[x][y]<=j;k++)dp[j]=max(dp[j],dp[j-k*c[x][y]]+k*v[x][y]);printf("%lld",dp[min(ti,a-1)]);return 0;
}

D.BUDGET

思路:

对于每个附件,我们将其存到主件下面,因为最多有两个附件,所以DP部分直接特判即可。但是需要特别注意输入时编号不是按照主件输入的顺序而是按照所有物件输入的顺序

代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
inline ll read(){ll x=0,f=1;char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=x*10+c-'0';c=getchar();}return x*f;
}
struct goods{ll p,im,num;}a[50005][5];
ll dp[50005];
int main(){ll m=read(),N=read(),n=0;for(int i=1;i<=N;i++){ll x,y,z;scanf("%lld%lld%lld",&x,&y,&z);if(!z){a[i][0].p=x;a[i][0].im=y;}else if(!a[z][1].p){a[z][1].p=x;a[z][1].im=y;}else{a[z][2].p=x;a[z][2].im=y;}}for(int i=1;i<=N;i++){for(int j=m;j>=a[i][0].p;j--){ll p0=a[i][0].p,p1=a[i][1].p,p2=a[i][2].p;ll im0=a[i][0].im,im1=a[i][1].im,im2=a[i][2].im;ll num=a[i][0].num;dp[j]=max(dp[j],dp[j-p0]+p0*im0);if(p0+p1<=j&&im1)dp[j]=max(dp[j],dp[j-p0-p1]+p0*im0+p1*im1);if(p0+p2<=j&&im2)dp[j]=max(dp[j],dp[j-p0-p2]+p0*im0+p2*im2);if(p0+p1+p2<=j&&im1&&im2)dp[j]=max(dp[j],dp[j-p0-p1-p2]+p0*im0+p1*im1+p2*im2);}}printf("%lld",dp[m]);return 0;
}

6.又双叒叕背包模拟相关推荐

  1. 背包问题动态规划解法

    一:题目: 背包问题 问题:两个数组 一个重量数组W 一个 价值数组 V 一个背包 bag  ,返回不超过背包容量返回最大价值 二:暴力解法 思路:暴力遍历,思路就是递归的时候 按 选或者不选 当前 ...

  2. CF3B Lorry (手动模拟01背包,贪心)难度⭐⭐⭐

    这道题洛谷上的翻译是错的,最后输出格式那里应该是输出一行所选物品的编号,中间用空格隔开 手动模拟01背包 这道题看上去很像是01背包的模板题,但是很明显,v=1e9,正常的01背包是肯定会爆掉62MB ...

  3. JZOJ__Day 6:【普及模拟】团队背包(team)

    题目描述 DaA 和他的朋友组成一个团队去旅行了.他们每个人都准备了一个背包,用来装旅行用的物品.他们的背包有两个特点: 1. 每个人的背包能装无限多的物品,每种物品有一个价值,但只能装一件: 2. ...

  4. 【启智树NOIP模拟】奇偶【卢卡斯定理】【背包】【bitset】

    题意:给定 nnn 个数 aia_iai​ ,求选出(可以重复,考虑顺序)MMM 个数和为 SSS 的方案数模 222. n≤200,ai≤105,M,S≤1018n\leq 200,a_i\leq ...

  5. 暗黑破坏神(背包)(内部模拟)

    不开longlong见祖宗!!! scanf要打成lld!!!! 解析 分层背包的类板子题,更新dp过程中记录路径,最后递归输出即可 然而-- 一开始被卡成了27分!!! 不仅定义时开longlong ...

  6. jzoj3362,bzoj3758-[NOI2013模拟]数数【分段打表,背包,状压】

    正题 bzojbzojbzoj题面链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3758 题目大意 求A∼BA\sim BA∼B中有多少个数满 ...

  7. 【背包DP】【2018.9.20普及组模拟】T3(WOJ 3975)保护羊村

    题目(保护羊村): [题目描述] 伟大的Yyz 帮助羊羊们逃出了城堡,可Jack 自然不会善罢甘休."我会诅咒你们的!"杰杰恼羞成怒地喊道.回到羊村后,羊羊们发现羊村地震了.看来J ...

  8. 【NOIP2017提高A组模拟9.5】 NYG的背包

    题目描述 N Y G NYG NYG有一个神奇的背包,每放进去一个物品,背包的体积就会变大. 也就是说,每放进一个物品,背包会被占用一定的体积,但是紧接着背包的总体积又会增大一定的值(注意是在放入物品 ...

  9. 【2019.8.9 慈溪模拟赛 T2】摘Galo(b)(树上背包)

    树上背包 这应该是一道树上背包裸题吧. 众所周知,树上背包的朴素\(DP\)是\(O(nm^2)\)的. 但对于这种体积全为\(1\)的树上背包,我们可以通过记\(Size\)优化转移时的循环上界,做 ...

最新文章

  1. json boolean android,如何解析Android中的JSON?
  2. delphi与api中的加一减一函数
  3. mysql iops_MySQL实例IOPS使用率高的原因和解决方法
  4. 陈百强原来这么帅_朱一龙虽然很少玩手机,但居式打字法很有个性,手指飞舞超级帅!...
  5. php 获取语句,PHP获取当前服务器的基本语句
  6. 【My Sft】彩色图像分析软件V1.0.1.0
  7. 2021秋季软件工程实践总结
  8. 2019年python爬虫-我破解了中文裁判网数据挖掘-反爬技术哪些事情
  9. java 词典 分词_java分词中 用户自定义词典有什么要求
  10. 大数据面试3分钟自我介绍_通用面试两分钟自我介绍范文5篇
  11. (一)分布式存储综述
  12. 推荐四款非常好用的免费音乐播放器
  13. jquery使用html()css不生效,jquery可以添加css样式吗?
  14. 基于Winform开发S7.net协议 与Smart-200PLC通讯
  15. 华为工程师总结的LeetCode刷题笔记提供下载,太优秀了
  16. Python描述 LeetCode 875. 爱吃香蕉的珂珂
  17. MacOS下安装及配置Maven
  18. 如何在matlab图中以分数的形式显示除号
  19. 记2022年秋招经历
  20. win10 强制删除文件夹

热门文章

  1. 计数器/定时器8253/8254
  2. 赛扬处理器_英特尔发布11代奔腾、赛扬处理器 均支持AVX指令集
  3. php利用微信支付充值,利用thinkPHP怎么实现一个微信支付功能
  4. 合泰HT32F52342/HT32F52352芯片Pack下载和工程例程下载
  5. 通俗理解 什么是量纲
  6. [CSS]分享几条漂亮的下划线样式
  7. 合肥计算机函授专业,2015年想学电脑,合肥哪个学校比较好点,中国计算机函授学院怎么样?...
  8. 555定时器的原理与应用(1.1)
  9. Word文档目录自动生成和页码设置
  10. 配置 Swagger 文档的自动生成