倒推法,在正向思考策略无从下手时,可以逆向思考。
如下题
吉普车穿越1000KM沙漠,吉普车总装油量为500加仑,耗油率为1加仑/KM。必须用这个车在沙漠中建立临时油库。若吉普车用最少油穿越沙漠,应该在哪些地方建立油库,以及各处存储的油量。
我的思考:用递归解,用每个临时油库的油量和距离作为参数进行递归。
倒推递归
条件一:耗油最少即->每次出去到目的地恰好耗完所有的油即(500加仑)
条件二:每次最多带500加仑->就是每次最多走500KM(来回一共!!)
double dis //上一个油库距离下一个距离KM
double oil //存储的油 加仑
终点:dis =1000 oil = 0
oil -> 去 500KM 500加仑
下一个油库:dis = 500 oil = 500
这个油库要500加仑 必须要的
oil -> 一趟 + 去 1000加仑
下一个油库:oil = 1000 dis = 500/3
这个油库要1000加仑 必须要的
oil->2趟+去 1500加仑
……
….
再将每个油库的距离累加起来大于等于1000KM 就完成
下面上代码:
main()
{
int dis,k,oil,k;
dis = 500;
k = 1;
oil = 500;
do
{
print("storepoint",k,"distance",1000-dis,"oilquantity",oil);
k = k + 1;
dis = dis + 500/(2*k+1);
oil = 500*k;
}while(dis<1000);
oil = 500*(k-1)+(1000-dis)*(2*k-1);
print("storepoint",k,"distance",0,"oilquantity",oil);
}