实用算法的分析与程序设计——递推法(倒推法)

倒推法就是在不知初始值的情况下,经某种递推关系而获知问题的解或目标,再倒过来,推知它的初始条件。因为这类问题的运算过程是一一映射的,故可分析得其递推公式,然后再从这个解或目标出发,采用倒推手段,一步步地倒推到这个问题的初始陈述。

贮油点 一辆重型卡车欲穿过1000公里的沙漠,卡车耗油为1升/公里,卡车总载油能力为500公升,显然卡车装一次油是过不了沙漠的,因此四级必须设法在沿途建立几个贮油点,使卡车能顺利穿越沙漠,试问司机如何建立这些贮油点?每一贮油点应存多少汽油,才能使卡车以消耗最少汽油的代价通过沙漠?

算法分析

代码

/*
 * =====================================================================================
 *
 *       Filename:  recursion.cc
 *
 *    Description:  贮油点,一辆重型卡车欲穿过1000公里的沙漠,卡车耗油为1升/
 *          公里,卡车总载油能力为500公升。司机设法在沿途设几个储油
 *             点,使卡车能顺利穿越沙漠,问司机如何建立贮油点?每一贮
 *          油点应存多少汽油,才能使卡车以消耗最少汽油的代价通过?
 *
 *        Version:  1.0
 *        Created:  04/25/15 08:57:38
 *       Revision:  none
 *       Compiler:  gcc
 *
 *         Author:  xiu
 *   Organization:
 *
 * =====================================================================================
 */

#include<iostream>
using namespace std;

const int N = 100;      //N为所设贮油点数
const float Distance = 1000;    //沙漠的总长度
const int capacity = 500;   //卡车的载油能力

//输出各贮油点的信息,距离distance是距终点的距离
void out(float *distance, float *oil, int cur)
{
    cout<<"输出各贮油点的信息,距离distance是距终点的距离"<<endl;
    cout << "NO\tdistance\toil\n";
    for (int i = 0; i < cur; i++)
    {
        cout << i +
            1 << "\t" << distance[i] << "\t\t" << oil[i] << "\n";
    }
}

//递推求距离和贮油量
void recursion(float *distance, float *oil, int cur, float dis_sum)
{
    if ((dis_sum - Distance) >= 0.0001)
    {
        out(distance, oil, cur);
        return;
    }
    else
    {
        oil[cur] = (cur+1) * capacity;
        distance[cur] = dis_sum + ((float) capacity) / (2 * cur + 1);
        recursion(distance, oil, cur + 1, distance[cur]);
    }
}

int main()
{
    float distance[N] = { 0 };
    float oil[N] = { 0 };
    recursion(distance, oil, 0, 0.0);
    return 0;
}
时间: 2024-10-07 16:55:15

实用算法的分析与程序设计——递推法(倒推法)的相关文章

实用算法的分析与程序设计——递推法(贮油点 含算法分析、代码)

倒推法 所谓倒推法就是在不知初始值的情况下,经某种递推关系而获知问题的解或目标,再倒过来,推知它的初始条件,因为这类问题的运算过程是一一映射的,故可分析得其递推公式.然后再从这个解或目标出发,采用倒推手段,一步步地倒推到这个问题的初始陈述. 贮油点 一辆重型卡车欲穿越1000公里的沙漠,卡车耗油为1升/公里,卡车总载油能力为500公升,显然卡车装一次油是过不了沙漠的.因此四级必须设法在沿途建立几个储油点,使卡车能顺利穿越沙漠,试问司机如何建立这些贮油点?每一贮油点应存多少汽油,才能使卡车以消耗最

实用算法的分析与程序设计——递推法(顺推法)包含实例,代码

顺推法即由边界条件出发,通过递推关系式推出后项值,再由后项值按递推关系式推出再后项值...依次递推,直至从问题初始陈述向前推进到这个问题的解为止. 实例 代码 #include<iostream> #include<stdlib.h> using namespace std; const int maxN = 60 ; int N = 4 ,d = 2 , m = 3; float a1 = 2 ,an = 5; void input() { cout<<"i

一天一道算法题---6.6---排列递推(我不会)

感谢微信平台: 一天一道算法题-----每天多一点进步--- 好吧 这题 我看了它的分析 还是感觉很不清晰 自己的思路 闪过 逆序数 但也不行,,, 把题目 先放上来 problem:列出一个 1~n 的排列 可以通过一系列的交换得到(1,2,3--n)比如,{2,1,4,3}需要两次交换(1和2 3和4),(4,2,3,1)需要一次(4和1):给定n和k 统计有多少个排列至少需要K次交换能变成(1,2,3--n); 各位 大神 不要吝啬 留下你们的思路与想法 告知我 thanks... 今天

程序员必知的10大基础实用算法

    算法一:快速排序算法 快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个项目要Ο(n log n)次比较.在最坏状况下则需要Ο(n2) 次比较,但这种状况并不常见.事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的 架构上很有效率地被实现出来. 快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists). 算法步骤: 1 从数列中挑出一个元

《转》程序员必须知道的10大基础实用算法及其讲解

来源: Cricode  发布时间: 2014-06-19 08:27  阅读: 2018 次  推荐: 8   原文链接   [收藏] 算法一:快速排序算法 快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序n个项目要Ο(nlogn)次比较.在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见.事实上,快速排序通常明显比其他Ο(nlogn)算法更快,因为它的内部循环(innerloop)可以在大部分的架构上很有效率地被实现出来. 快速排序使用分治法(Divideandconque

十大基础实用算法之寻找最小(最大)的k个数-线性查找算法

例如:输入1,2,3,4,5,6,7,8这8个数字,则最小的4个数字为1,2,3,4. 思路1:最容易想到的方法:先对这个序列从小到大排序,然后输出前面的最小的k个数即可.如果选择快速排序法来进行排序,则时间复杂度:O(n*logn) 注:针对不同问题我们应该给出不同的思路,如果在应用中这个问题的规模不大,或者求解前k个元素的频率很高,或者k是不固定的.那么我们花费较多的时间对问题排序,在以后是使用中可以线性时间找到问题的解,总体来说,那么思路一的解法是最优的. 思路2:在思路1的基础上更进一步

十大基础实用算法之动态规划

动态规划(Dynamic programming)是一种在数学.计算机科学和经济学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法. 动态规划常常适用于有重叠子问题和最优子结构性质的问题,动态规划方法所耗时间往往远少于朴素解法. 动态规划背后的基本思想非常简单.大致上,若要解一个给定问题,我们需要解其不同部分(即子问题),再合并子问题的解以得出原问题的解. 通常许多子问题非常相似,为此动态规划法试图仅仅解决每个子问题一次,从而减少计算量: 一旦某个给定子问题的解已经算出,则将

Adaboost算法原理分析和实例+代码(简明易懂)

Adaboost算法原理分析和实例+代码(简明易懂) [尊重原创,转载请注明出处] http://blog.csdn.net/guyuealian/article/details/70995333     本人最初了解AdaBoost算法着实是花了几天时间,才明白他的基本原理.也许是自己能力有限吧,很多资料也是看得懵懵懂懂.网上找了一下关于Adaboost算法原理分析,大都是你复制我,我摘抄你,反正我也搞不清谁是原创.有些资料给出的Adaboost实例,要么是没有代码,要么省略很多步骤,让初学者

各种排序算法的分析及java实现

各种排序算法的分析及java实现 排序一直以来都是让我很头疼的事,以前上<数据结构>打酱油去了,整个学期下来才勉强能写出个冒泡排序.由于下半年要准备工作了,也知道排序算法的重要性(据说是面试必问的知识点),所以又花了点时间重新研究了一下. 排序大的分类可以分为两种:内排序和外排序.在排序过程中,全部记录存放在内存,则称为内排序,如果排序过程中需要使用外存,则称为外排序.下面讲的排序都是属于内排序. 内排序有可以分为以下几类: (1).插入排序:直接插入排序.二分法插入排序.希尔排序. (2).