小红开车去北京,距离是L公里,起始P升油,每升油跑x公里。路上i个加油站,距离起点距离是Ai,加油站存油量是Bi,这是两个数组,假设汽车可以无限加油。问能不能到北京,如果能到,最少加几次油,在哪里加油。
#include<iostream>
#include<stdio.h>
#define N 10
double dis[N]={0,1,2,3,4,5,6,7,8,9}; //距离数组
double res[N]={0,0.8,3,0.8,2,2,0.5,1,2,0.2}; //加油站油量
int record[N]; //临时加油方案
int best_record[N]; //最优加油方案
double x=1;//每升油跑x公里
int best_results=0; //最少加油次数
double resi_oil=1.2; //初始油量,也表示每一站剩余油量
void init()
{
int i,j;
for(i=0;i<N;i++)
{
best_record[i]=1;
}
best_results=N;
}
void print()
{
printf("MIN_times=%d\n",best_results);
for(int i=0;i<N;i++)
printf("record[%d]=%d\n",i,record[i]);
}
bool nextstation(double* dis,double*res,int i)
{
resi_oil-=x*(dis[i]-dis[i-1]);
int temp_results=0;
if(i==N-1)
{
for(int j=0;j<N;j++)
temp_results+=record[j];
if(temp_results<best_results)
{
best_results=temp_results;
for(int j=0;j<N;j++)
best_record[j]=record[j];
}
return 1;
}
if(resi_oil>=x*(dis[i+1]-dis[i]))
{
record[i]=0;
if(nextstation(dis,res,i+1)) return 1;
}
if(resi_oil+res[i]>=x*(dis[i+1]-dis[i]))
{
int temp=0;
resi_oil+=res[i];
record[i]=1;
for(int j=0;j<=i;j++)
temp+=record[j];
if(temp<=best_results)
return nextstation(dis,res,i+1);
else
{
record[i]=1;
return 0;
}
}
else
{
return 0;
}
}
void main()
{
init();
nextstation(dis,res,1);
print();
system("pause");
}