算法设计-倒推法

来源:互联网 发布:java shell 编辑:程序博客网 时间:2024/06/06 09:51

倒推法,在正向思考策略无从下手时,可以逆向思考。

如下题

吉普车穿越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);}