思路一:每次dfs寻找一个可行方案,记得每次dfs后都要给visited数组置零
#include <bits/stdc++.h>
using namespace std;
const int N=40;
int a,b,n,ans;
int hotel_distance[N]={0,990,1010,1970,2030,2940,3060,3930,4060,4970,5030,5990,6010,7000};
int visited[N];
void dfs(int km){
for(int i=1;i<n+14;i++){
if(hotel_distance[i]>=km+a&&hotel_distance[i]<=km+b&&!visited[i]){
if(hotel_distance[i]==7000){
ans++;return;
}
visited[i]=1;
dfs(hotel_distance[i]);
visited[i]=0;
}
else if(km+a>=7000){
ans++;return;
}
}
}
int main()
{
cin>>a>>b>>n;
for(int i=14;i<n+14;i++)
cin>>hotel_distance[i];
dfs(0);
cout<<ans;
return 0;
}
思路二:枚举所有的旅馆的位置,如果现在到的旅馆的位置和枚举的旅馆的位置的距离在A和B之内,那么plan[i]就要加plan[j]
#include <bits/stdc++.h>
using namespace std;
const int N=40;
int a,b,n;
int hotel_distance[N]={0,990,1010,1970,2030,2940,3060,3930,4060,4970,5030,5990,6010,7000};
int plan[N]={1};//plan[i]表示旅行到第i个旅馆时的方案总数
int main()
{
cin>>a>>b>>n;
for(int i=14;i<n+14;i++)
cin>>hotel_distance[i];
sort(hotel_distance,hotel_distance+n+14);
for(int i=1;i<n+14;i++)
for(int j=0;j<i;j++)
if(hotel_distance[i]-hotel_distance[j]>=a&&hotel_distance[i]-hotel_distance[j]<=b)
plan[i]+=plan[j];
cout<<plan[n+13];
return 0;
}
思路三:dp动态规划
#include <bits/stdc++.h>
using namespace std;
const int N=40;
int a,b,n;
int hotel_distance[N]={0,990,1010,1970,2030,2940,3060,3930,4060,4970,5030,5990,6010,7000};
int dp[N];//dp[i]表示第i个旅馆到7000米处的走法数
int main()
{
cin>>a>>b>>n;
for(int i=14;i<n+14;i++)
cin>>hotel_distance[i];
sort(hotel_distance,hotel_distance+n+14);
dp[n+13]=1;//dp初始化
for(int i=n+13;i>=0;i--)
for(int j=i+1;j<n+14;j++)
if(hotel_distance[j]-hotel_distance[i]>=a&&hotel_distance[j]-hotel_distance[i]<=b)//能到
dp[i]+=dp[j];//加上它的走法
cout<<dp[0];
return 0;
}