222

#include <iostream>
#include <cstdio>
#include <queue>

#define INF 1000000

using namespace std;

struct state{
	int presnt;
	double rem_gas;
	double cost;
	};
double d[55],price_gal[55];
double gr[55][55],dst[55][55];
bool visit[55];
int L;
double dist,cango;
double capacity,dist_pergal,price;
int station;
double MN;


int recurs(state a)
{
	int pos = a.presnt;
	double gaso = a.rem_gas;
	double cst = a.cost;

	state t;
	if(pos==L)
	{
		if(MN>cst)
		MN = cst;
		return 0;
	}
	if(gaso>=capacity/2)
	{
		bool flag = true;
		for(int i=pos+1;i<=L;i++)
		{
			if(visit[i])
			continue;
			double distance = dst[i][pos];
			if((dist_pergal*gaso)>=distance)
			{
				t.presnt = i;
				t.cost = cst;
				t.rem_gas= gaso - distance/dist_pergal;
				visit[i]=1;
				recurs(t);
				visit[i]=0;
				flag=0;
			}
		}
		if(flag)
		{
			a.presnt = pos;
			a.cost = cst + (capacity-gaso)*price_gal[pos]+2;
			a.rem_gas = capacity;
			recurs(a);
			visit[pos]=0;
		}
	}
	else
	{
		for(int i=pos+1;i<=L;i++)
		{
			if(visit[i])
			continue;
			double distance = dst[i][pos];
			if((dist_pergal*gaso)>=distance)
			{
				t.presnt = i;
				t.cost = cst;
				t.rem_gas= gaso - distance/dist_pergal;
				visit[i]=1;
				recurs(t);
				visit[i]=0;
			}
		}
		a.presnt = pos;
		a.cost = cst + (capacity-gaso)*price_gal[pos]+2;
		a.rem_gas = capacity;
		recurs(a);
		visit[pos]=0;
	}
	return 0;
}


int main()
{
	int kase=1;
	while(cin>>dist)
	{
		if(dist<0)
		break;
		cin>>capacity>>dist_pergal>>price;
		cango = capacity/dist_pergal;
		cin>>station;
		L=1;
		for(int i=0;i<55;i++)
		{
			visit[i]=false;
			for(int j=0;j<55;j++)
			{
				if(i==j)
				dst[i][j]=0;
				else
				dst[i][j]=INF;
			}
		}
		d[0]=0;
		price_gal[0]=price/capacity;
		while(station--)
		{
			cin>>d[L]>>price_gal[L];
			price_gal[L]/=100;
			for(int i=0;i<L;i++)
			{
				dst[L][i]=d[L]-d[i];
			}
			L++;
		}
		if(d[L-1]<dist)
		{
			d[L] = dist;
	        for(int i=0;i<L;i++)
        	{
				dst[L][i]=d[L]-d[i];
        	}
		}

		MN = INF;
		state s;
		s.presnt = 0;
		s.rem_gas = capacity;
		s.cost = price;
		visit[0]=1;
		recurs(s);
		visit[0]=0;
		cout<<"Data Set #"<<kase++<<"\n";
		printf("minimum cost = $%.2lf\n",MN);
	}

	return 0;
}

 

Leave a Reply

Your email address will not be published. Required fields are marked *