Description
银河帝国正走向覆亡。为保留文明的种子,你需要驾驶飞船将一批“颛家”从帝国首都护送至银河边缘的基地。 现在已知航线是一条直线,帝国首都为起点(坐标0),基地为终点(坐标L),在这条航线上有N个空间站可以补充飞船的能源。 第i个空间站的坐标为ai,飞船停靠在第i个空间站必须花费bi个银河币,同时让你的飞船能量恢复为最大值M。 出发前飞船的能量是满额的M,每一点能量都可以让飞船航行一个坐标单位。 现在你已经通过募捐(榨篇)获得了S个银河币,请计算下飞船能否到达基地。
输入格式
第一行输入四个个数字N,L,M,S;(1<=N<=200) (1<=L<=20000) (1<=M<=20000) (0<=S<=20000) 接下来N行,每行输入两个数字,ai,bi (0<=ai<=L) (0<=bi<=20000)
输出格式
仅一行,如果能到达基地,输出Yes,否则输出No
输入样例
1 10000 5000 20000 5000 20000
输出样例
Yes
提示
样例说明,飞船可以花费5000能量到达一号空间站,花光20000银河币补满能量后,再行驶5000到达基地。 算法设计要考虑边缘数据。例如本题目,可能存在无需补给就直接行驶到基地的情况,也能存在bi>s的情况。
思路
题意:从起点到终点,起始资金S,起始能量M,全程L,每走一个坐标花费一个能量,在每一个坐标处停靠花费ai元,充电至M。
首先会存在一种特殊的情况,就是初始能量足够走完全程,故这个可以先挑出来考虑,一定可以到达终点。
其余情况用dfs来考虑,在每一个坐标点都可以先考虑特殊情况,此时的能量如果足够到达终点,同样可以直接得出结论。
一般情况下就是每一个坐标点都要考虑,就是只有两种情况,停不停,如果此时的钱足够支付且能量能够到达下一个地点,则充满电继续往前,到下一个坐标点,直到到达终点。
对于为什么每一个点都要停下来充电,是因为,每一个站点所需要的能量是一样的,在哪充电都是可以的。而且在函数中也对特殊情况进行了判断,一旦不充电就可以到达终点,就直接返回,不再进入递归。
#include<stdio.h>
struct node
{
int a;
int b;
}choose[250];
int flag;
int N,L,M,S;
void dfs(int m,int e,int n)
{
if(e+n>=L)
{
flag=1;
return ;
}
int i;
for(i=1;i<=N;i++)
{
if(m>=choose[i].b&&e>=choose[i].a-n)
{
dfs(m-choose[i].b,M,choose[i].a);
}
}
}
int main()
{
scanf("%d %d %d %d",&N,&L,&M,&S);
int i;
for(i=1;i<=N;i++)
scanf("%d %d",&choose[i].a,&choose[i].b);
if(M>=L)
flag=1;
dfs(S,M,0);
if(!flag)
printf("No");
else
printf("Yes");
return 0;
}