迭代算法集锦(倒推法)

求解步骤

1.确定迭代模型
2.建立迭代关系式
3.控制迭代过程

今天我们来用几个简单的例子来了解倒推法

倒推法

1.猴子吃桃

题目描述:

猴子第一天采摘了一些桃子,
第二天吃了第一天的一半多一个,
第三天吃了第二天的一半多一个...
直到第十天就剩下一个。问:猴子第一天摘了多少桃子? 

算法分析 :
递推关系: 根据题意

f(n)=f(n-1)/2-1

f(n-1)=(f(n)+1)*2

边界条件:f(10)=1
(递推算法是一种自下而上的)
代码实现:

#include <iostream>
#include <algorithm>
using namespace std;
 
int main()
{
//猴子吃桃
     int f[11];
     f[10] = 1;
     for(int i = 10;i > 1;i--){
       f[i-1] = (f[i] + 1) * 2;
     }
     cout<<f[1];
    return 0;
}
 

2.杨辉三角(使用一个一维数组)
算法分析 :
递推关系: 根据题意

A[1]=A[i]=1
A[j]=A[j]+A[j-1]   (j=i-1,i-2,......2)

代码实现:

#include <stdio.h>

main()

{ int i,j,n=0,a[17]={1},b[17];

while(n<1 || n>16)

{ printf("请输入杨辉三角形的行数:");

scanf("%d",&n);

}

for(i=0;i<n;i++)

{ b[0]=a[0];

for(j=1;j<=i;j++)

b[j]=a[j-1]+a[j]; /*每个数是上面两数之和*/

for(j=0;j<=i;j++)

/*输出杨辉三角*/

{ a[j]=b[j]; /*把算得的新行赋给a,用于打印和下一次计算*/

printf("%5d",a[j]);

}

printf("\n");

}

}

3.穿越沙漠

问题描述:

一辆吉普车来到1000km宽的沙漠边沿。吉普车的耗油量为1L/km,总装油量为500L。显然,吉普车必须用自身油箱中的油在沙漠中设几个临时 加油点,否则是通不过沙漠的。假设在沙漠边沿有充足的汽油可供使用,那么吉普车应在哪些地方、建多大的临的加油点,才能以最少的油耗穿过这块沙漠?

问题分析
储油点地址的确定比较复杂,从出发点考虑问题,很难确保按要求以最少的耗油量穿越沙漠,即很难保证到达终点时,沙漠中的各临时油库和车的储油量都恰好为0。所以我们从终点向起点应用逆推法。
过程:

为了做到耗油最少,那么每次吉普车出发时都应满载,放下一部分油再返回时,油恰好用完,并且把下一个油库建好后这个油库中的油恰好用完。-------->
每个点的油库中的油都应是吉普车装油量的整数倍(因为出发时满载),即500n(n为正整数),并且每个点的 存油量为下一个点的存油量及吉普车为建立下个油库在两点之间往返的油耗之和 (下一个油库建成,前一个油库中的油恰好用完)。

(1)由题可知,吉普车满载可以走500km。所以,第一段(即离终点最近的一段)长度为500km,并且,第一个加油点station_1(也是离终点最近的)的储油量为500L。
(2)那我们来看第二个加油点station_2。
它需要储存上一个加油点的储油量 + 车来往的耗油量。为了给station_1送500L油,车至少送两次油(因为中间路程要耗油嘛)。所以,车往返路程共3趟。
又考虑最少油耗,我们使这3趟路程耗油500L。那么station_2距station_1为500/3 = 167km,总共储油1000L。
(3)同样,我们看station_3。
为了给station_2送1000L油,至少送3次嘛,所以往返共5趟。
同样考虑耗油最少,那么station_3距station_2为 500/5 = 100km。

代码实现:

/*
dis为储油点到终点的距离
*/

#include <stdio.h>

int main()
{
    int dis = 500, oil = 500;
    int k = 1;
    //因为不确定循环次数,又至少做一次,所以我们用do_while
    do
    {
        printf("储油点%d:距离出发点%5d,",k,1000-dis);
        printf("储油量%5dL\n",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);
    printf("储油点%d:距离出发点%5d,储油量%5dL\n",k,0,oil);

    return 0;
}

发布了25 篇原创文章 · 获赞 5 · 访问量 339

猜你喜欢

转载自blog.csdn.net/weixin_44602007/article/details/104807766