【ACPC2013】马里奥赛车(01背包)
这里终究是个技术社区,老是在这里写中二少年的风花雪月也不大好,来写一篇题解。
这题目混进了软件工程大一新生的java基础题目里,与其他设计类、熟悉语法的题目格格不入不讲武德。我一查来源,好家伙是中东+非洲的大学生程序竞赛,老师找到这题目也是不容易,而且各大OJ上也没有。
题目大意
路上有n个车站,你有m个硬币,每个硬币都有自己的能量和使用成本,每组数据有成本限制l。
从a车站跳跃到b车站的方法是:使用一些硬币的组合,使这些硬币的能量恰好等于两车站距离(坐标之差之绝对值)。
对于一次跳跃,每硬币只能用一次且使用的硬币成本之和不超过l。
你的目的是从坐标最小的车站跳跃到坐标最大的车站,使跳跃次数尽可能少。
输入格式
第一行给定数据组数T
接下来T组数据,每组数据:
第一行n(<=100),m(<=100),l(<=1000)
接下来一行中n个数,分别是n个车站的坐标(无序)
接下来m行,每行两个数,代表该硬币成本与能量
输出格式
T行,代表每组数据最小跳跃次数,若不能到达输出-1
这道题目,首先想到最后找次数是最短路,但由于是记录次数,则此题无边权(边权相等),所以我直接广搜。
接下来主要思考怎样连边。
其实题目说得很直白了,看到恰好二字,想到NOIP2018d1t2,判断将不同面额的货币能否凑为某特定值,使用了完全背包(因为每种货币数量不限)。
然而此题又增加了成本限制,所以不能用单纯的01背包解决。显然,对于待凑路程的最优情况就是成本最低,所以与一般意义上背包凑出最大价值不同,这道题需要找到最小成本。
那么题意中硬币的成本转化为一般背包的价值;
题意中硬币的能量转化为一般背包的重量。
既然追求最小,则需要初始化最小可能路程~最大可能路程为无穷大。这样数据更新只能从容量为0的状态开始,凡是不能正好凑出的路程数,成本均为无穷大。
状态f[j]代表跳跃j路程所需最小成本。
则状态转移方程f[j]=min(f[j],f[j-ci]+vi)
这样当仅f[abs(两坐标之差)]<=l时,两车站连边。
由于数据较小,直接使用邻接矩阵。
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc=new Scanner(System.in);int tt=sc.nextInt();int[] a=new int[105];int[] vis=new int[105];int[] f=new int[1005];int[][] x=new int[105][105];while(tt-->0){int n=sc.nextInt();for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)x[i][j]=0;for(int i=1;i<=n;i++)vis[i]=0;int m=sc.nextInt();int l=sc.nextInt();int max=-1<<20,min=1<<20,maxn=0,minn=0;for(int i=1;i<=n;i++){int tmp=sc.nextInt();if(tmp>max){max=tmp;maxn=i;}if(tmp<min){min=tmp;minn=i;}a[i]=tmp;}for(int i=1;i<=max-min;i++)f[i]=1<<30;for(int i=1;i<=m;i++){//DPint w=sc.nextInt();int v=sc.nextInt();for(int j=max-min;j>=v;j--)f[j]=Math.min(f[j],f[j-v]+w);}/* for(int i=1;i<=max-min;i++) System.out.print(f[i]+" ");*/for(int i=1;i<n;i++)//连边for(int j=i+1;j<=n;j++)if(f[Math.abs(a[i]-a[j])]<=l){x[i][j]=1;x[j][i]=1;}/*for(int i=1;i<=n;i++) {for (int j = 1; j <= n; j++) System.out.print(x[i][j] + " ");System.out.println();}*/Queue<Integer> q = new LinkedList<Integer>();//java的队列声明还找了半天Queue<Integer> qx = new LinkedList<Integer>();q.add(minn); qx.add(0); vis[minn]=1;//准备广搜int fl=0;while(!q.isEmpty()){int e=q.poll(); int ex=qx.poll();if(e==maxn){System.out.println(ex);fl=1;break;}for(int i=1;i<=n;i++)if(x[e][i]==1&&vis[i]==0){q.add(i);qx.add(ex+1);vis[i]=1;}}if(fl==0)System.out.println("-1");}}
}
注意背包DP中,f数组中每个值都是最优的,不只是f[背包容量]有用。
【ACPC2013】马里奥赛车(01背包)相关推荐
- 浅说——九讲背包之01背包
所谓九讲,也就是: 0/1背包 0/1背包降维 完全背包 多重背包(二进制优化) 混合背包 二维费用背包 分组背包 有依赖的背包 背包的方案总数\背包的具体方案路径 0/1背包: [问题描述](经典) ...
- Codeforces Round #104 (Div. 2) E DP(01背包模型) +组和+除法取模求逆元
题意: 规定只包含4或7的数为幸运数字,给定n个数的序列,求他的子序列,使得该子序列的长度为k并且满足该子序列中不存在相同的两个幸运数字.问一共寻在多少种可能.(只要该数的下标不同则认为是不同的序列) ...
- 最小邮票数(01背包)
题目描述 有若干张邮票,要求从中选取最少的邮票张数凑成一个给定的总值. 如,有1分,3分,3分,3分,4分五张邮票,要求凑成10分,则使用3张邮票:3分.3分.4分即可. 输入描述: 有多组数 ...
- NYOJ 860 又见01背包
有n个重量和价值分别为wi 和 vi 的 物品,从这些物品中选择总重量不超过 W 的物品,求所有挑选方案中物品价值总和的最大值. 1 <= n <=100 1 <= wi < ...
- 背包问题(多重背包+0-1背包)
一:0-1背包问题 #include<iostream> #include<algorithm> #include<cstring> const int maxn= ...
- 背包模型dp1:01背包,完全背包,多重背包的两大优化的详解
01背包问题: 状态表示:f[i][j]表示从只从前i个物体里面选,切总体积不超过j的选法的集合状态表示:f[i][j]表示从只从前i个物体里面选,切总体积不超过j的选法的集合状态表示:f[i][j] ...
- CF3B Lorry (手动模拟01背包,贪心)难度⭐⭐⭐
这道题洛谷上的翻译是错的,最后输出格式那里应该是输出一行所选物品的编号,中间用空格隔开 手动模拟01背包 这道题看上去很像是01背包的模板题,但是很明显,v=1e9,正常的01背包是肯定会爆掉62MB ...
- 【每日DP】day4 P1417 烹调方案(奇怪的01背包增加了)难度⭐⭐⭐
P1417 烹调方案 每件物品只有一个,很明显是01背包,但是价值的转换方式不同,是要求 ai−t∗bia_i-t*b_iai−t∗bi 尽可能最大.普通的01背包的价值是不变的,而这一道题目中的 ...
- 【每日DP】day1 P1802 5倍经验日(别样的01背包)难度⭐★
题目链接 输入 6 8 21 52 1 21 70 5 21 48 2 14 38 3 14 36 1 14 36 2 输出 1060 一道有点意思的01背包,可以帮助理解.好久没写DP了,每天一道D ...
最新文章
- 循环爬取图片_Java爬取简单的网页内容和图片
- requests+正则爬取猫眼电影前100
- BootStrap入门教程 (四)
- Hi3516A开发-- OSD功能实现
- moment 时间格式化
- android 快速新建字符资源
- ffplay命令汇总
- android 圆环温度控件,android 圆环倒计时控件
- Java线程状态Jstack线程状态BLOCKED/TIMED_WAITING/WAITING解释
- 基础知识—循环语句-while
- 7天学会python_Python学习:第七天
- 三十、K8s供应链安全1-准入控制器
- Cadence元件库介绍
- 《ARM64体系结构编程与实践》开始预订了
- 思科模拟器交换机的基本配置
- linux防护勒索病毒的补丁,抵御Petya勒索病毒的最新办法
- UEFI规范驱动模型(二):驱动加载过程
- Duplicated tag: ‘dependencies‘报错
- win7 计算机不显示u盘重装系统,win7系统重装U盘读不出解决方法
- 外部表报错:ORA-29913: 执行 ODCIEXTTABLEOPEN 调出时出错 ORA-29400: 数据插件错误KUP-04043: table column not found in ext