洛谷 P1515 旅行

在这里插入图片描述
思路一:每次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;
}
发布了99 篇原创文章 · 获赞 44 · 访问量 5518

猜你喜欢

转载自blog.csdn.net/weixin_44413191/article/details/103338309