我正在编写一个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
的输出示例谢谢!
答案 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的概念,甚至是动态编程。前者可以帮助您提高递归解决方案的性能,而后者可以为同一问题提供类似但不同的解决方案。