给驴的

小红开车去北京,距离是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");
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值