P1433 吃乳酪 (dfs+剪枝)

liuliu2333發表於2018-05-04
題目描述
房間裡放著n塊乳酪。一隻小老鼠要把它們都吃掉,問至少要跑多少距離?老鼠一開始在(0,0)點處。
輸入輸出格式
輸入格式:
第一行一個數n (n<=15)
接下來每行2個實數,表示第i塊乳酪的座標。
兩點之間的距離公式=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))
輸出格式:
一個數,表示要跑的最少距離,保留2位小數。
輸入輸出樣例
輸入樣例#1: 複製
4
1 1
1 -1
-1 1
-1 -1
輸出樣例#1: 複製
7.41

直接暴力會超時,剪枝一下。。。

#include<bits/stdc++.h>
using namespace std;
double sum=0,ans=1000000000;int n;	double a[20],b[20],c[20];double dis[20][20];
void dfs(int w,int r)
{
	if(sum>ans)//這剪枝有點。。。 
	return ;
	if(r==n)
	{
		if(ans>sum)
		ans=sum;
		return ;
	}
	for(int i=1;i<=n;i++)
	{
		if(c[i]==0)
		{
	        sum=sum+dis[w][i];	
			c[i]=1;
			dfs(i,r+1);
			c[i]=0;
			sum=sum-dis[w][i];	
		}
	}
}
int main()
{
	

	scanf("%d",&n);
	memset(c,0,sizeof(c));
	for(int i=1;i<=n;i++)
	{
	    scanf("%lf %lf",&a[i],&b[i]);	
	}
	for(int i=0;i<=n;i++)
	{
		for(int j=0;j<=n;j++)
		dis[i][j]=sqrt((a[i]-a[j])*(a[i]-a[j])+(b[i]-b[j])*(b[i]-b[j]));
	}
	c[0]=1;
	dfs(0,0);
	printf("%.2lf\n",ans);
	return 0;
 } 

相關文章