C ++简单程序来计算步长

时间:2017-01-25 13:40:32

标签: c++ algorithm

我正在编写一个C ++程序,它应该显示步行时可能使用的步骤的每个可能组合,给定行走距离,步数和最大步长。我实现了一个只能执行两个步骤的算法,我不知道下一步该做什么,以使其能够使用多个步骤。

#include <iostream>

int main()
{
    int maxsteplength, steps, distance;

    std::cin >> maxsteplength >> steps >> distance;

    //for(int i=0; i<steps; i++)
    //{
        for(int j=1; j<=maxsteplength; j++)
        {
            for(int x=1; x<=maxsteplength; x++)
            {
                if(j+x==distance) std::cout << j << " " << x << std::endl;
            }
        }
    //}
    return 0;
}

在此代码变量中,步骤甚至无法正常工作,因为它始终仅通过两个步骤计算所有可能的方式。 例如。 Wrote 80 steps, but counts only with 2

以下是我想要maxsteplength=50, steps=2, distance=30

的输出示例

谢谢!

1 个答案:

答案 0 :(得分:0)

您的问题有多种解决方案,但我建议您研究一种称为递归的技术。基本上,它根据同一问题定义了一个问题,但尺寸较小。这样,通过解决相同问题的较小实例,可以为更大的问题组装解决方案。

对于您的问题,请考虑如下的递归解决方案。

#include <iostream>
#include <vector>

void recursive_step(int maxsteplength, int steps, int distance, std::vector<int>& vec)
{
    if(steps == 0)
    {
        if(distance == 0)
        {
            std::cout << vec[0];
            for(int x = 1; x < vec.size(); x++)
            {
                std::cout << " " << vec[x];
            }
            std::cout << std::endl;
        }
        return;
    }

    for(int x=(vec.size() > 0 ? vec.back() : 1); x <= maxsteplength; x++)
    {
        if(distance - x >= 0)
        {
            vec.push_back(x);
            recursive_step(maxsteplength, steps-1, distance - x, vec);
            vec.pop_back();
        }
    }
}

int main()
{
    int maxsteplength, steps, distance;

    std::cin >> maxsteplength >> steps >> distance;
    std::vector<int> vec;
    recursive_step(maxsteplength, steps, distance, vec);
    return 0;
}

请注意此解决方案效率低得令人难以置信,并且对于大输入尺寸可能会失败,尤其是对于大的最大长度和大距离。我建议使用这个解决方案作为原型,并使用自己的,更好,更有效的递归解决方案。

一旦你掌握了递归,并且可以使用递归来解决这个问题,你可以研究一下memoization的概念,甚至是动态编程。前者可以帮助您提高递归解决方案的性能,而后者可以为同一问题提供类似但不同的解决方案。