这里终究是个技术社区,老是在这里写中二少年的风花雪月也不大好,来写一篇题解。
这题目混进了软件工程大一新生的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背包)相关推荐

  1. 浅说——九讲背包之01背包

    所谓九讲,也就是: 0/1背包 0/1背包降维 完全背包 多重背包(二进制优化) 混合背包 二维费用背包 分组背包 有依赖的背包 背包的方案总数\背包的具体方案路径 0/1背包: [问题描述](经典) ...

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

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

  3. 最小邮票数(01背包)

    题目描述 有若干张邮票,要求从中选取最少的邮票张数凑成一个给定的总值.     如,有1分,3分,3分,3分,4分五张邮票,要求凑成10分,则使用3张邮票:3分.3分.4分即可. 输入描述: 有多组数 ...

  4. NYOJ 860 又见01背包

    有n个重量和价值分别为wi 和 vi 的 物品,从这些物品中选择总重量不超过 W  的物品,求所有挑选方案中物品价值总和的最大值. 1 <= n <=100 1 <= wi < ...

  5. 背包问题(多重背包+0-1背包)

    一:0-1背包问题 #include<iostream> #include<algorithm> #include<cstring> const int maxn= ...

  6. 背包模型dp1:01背包,完全背包,多重背包的两大优化的详解

    01背包问题: 状态表示:f[i][j]表示从只从前i个物体里面选,切总体积不超过j的选法的集合状态表示:f[i][j]表示从只从前i个物体里面选,切总体积不超过j的选法的集合状态表示:f[i][j] ...

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

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

  8. 【每日DP】day4 P1417 烹调方案(奇怪的01背包增加了)难度⭐⭐⭐

    P1417 烹调方案 每件物品只有一个,很明显是01背包,但是价值的转换方式不同,是要求 ai−t∗bia_i-t*b_iai​−t∗bi​ 尽可能最大.普通的01背包的价值是不变的,而这一道题目中的 ...

  9. 【每日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 ...

最新文章

  1. 循环爬取图片_Java爬取简单的网页内容和图片
  2. requests+正则爬取猫眼电影前100
  3. BootStrap入门教程 (四)
  4. Hi3516A开发-- OSD功能实现
  5. moment 时间格式化
  6. android 快速新建字符资源
  7. ffplay命令汇总
  8. android 圆环温度控件,android 圆环倒计时控件
  9. Java线程状态Jstack线程状态BLOCKED/TIMED_WAITING/WAITING解释
  10. 基础知识—循环语句-while
  11. 7天学会python_Python学习:第七天
  12. 三十、K8s供应链安全1-准入控制器
  13. Cadence元件库介绍
  14. 《ARM64体系结构编程与实践》开始预订了
  15. 思科模拟器交换机的基本配置
  16. linux防护勒索病毒的补丁,抵御Petya勒索病毒的最新办法
  17. UEFI规范驱动模型(二):驱动加载过程
  18. Duplicated tag: ‘dependencies‘报错
  19. win7 计算机不显示u盘重装系统,win7系统重装U盘读不出解决方法
  20. 外部表报错:ORA-29913: 执行 ODCIEXTTABLEOPEN 调出时出错 ORA-29400: 数据插件错误KUP-04043: table column not found in ext

热门文章

  1. EVG实现芯片到晶圆的融合和混合键合
  2. 三菱梯形图转换c语言软件,梯形图转51软件(三菱PMW文件转51)
  3. iOS时间戳与北京时间的转换
  4. 计算机管理器用户怎么打开文件,电脑文件管理器怎么打开文件夹 文件管理器打开想要的文件夹方法-电脑教程...
  5. 国内下载国外数据集(库)方案整理
  6. Golang 依赖包下载时候代理设置
  7. app登录的token设计
  8. SVG 2D入门4 - 笔画与填充
  9. 在 WPF 中使用 Prism DryIOC 加载应用程序时导航到默认视图
  10. css样式属性值无效问题