dfs
#include<bits/stdc++.h>
using namespace std;
// 已经有的旅馆列表:
int A,B,n,ans,a[40]={0,990,1010,1970,2030,2940,3060,3930,4060,4970,5030,5990,6010,7000};
void lx/*dfs*/(int k)//k:第k个旅馆
{
//所有旅馆都走过了[满足条件]
if(k==n){
//方法+1
ans++;
return;
}
//从第k个旅馆出发
for(int i=k+1;i<=n;i++)
//(当日?)所走路程满足条件{A<=路程<=B}
if(a[i]-a[k]>=A&&a[i]-a[k]<=B/*可以走*/)
lx(i);//去第i个旅馆
}
int main()
{
cin>>A>>B>>n;
//[输入]新增的旅馆(距起点)路程
for(int i=1;i<=n;i++)
cin>>a[13+i];
//把新增的旅馆数和本有的旅馆数加起来(方便使用!)
n=n+13;
//此时n代表所有旅馆数量!
//将旅馆路程远近(从小到大)排序{包括起点!}
sort(a,a+n+1);
//从起点出发!
lx(0);
cout<<ans;
re
dp
#include<bits/stdc++.h>//超级万能头
using namespace std;
int a,b,n,ans[40],r[40]={0,990,1010,1970,2030,2940,3060,3930,4060,4970,5030,5990,6010,7000};
//旅馆初始化
int main(){
scanf("%d %d %d",&a,&b,&n);
for (int i=14;i<14+n;i++) cin>>r[i];//输入
sort(r,r+14+n);//排序
ans[0]=1; //起始点默认一套方案
for (int i=1;i<14+n;i++){//枚举所有点
for (int j=0;j<i;j++){//枚举这个点之前的点
if (r[i]-r[j]>=a&&r[i]-r[j]<=b){//如果这两个点之间的距离符合要求
ans[i]+=ans[j];//这个点可以获得前面那个点的所有可能
}
}
}
cout<<ans[13+n]<<endl;//输出到终点时的所有可能
return 0;//好习惯不可忘
}
over~